Linux中的分段错误
问题描述:
当我编译代码并运行它时,它说Segmentation Fault
。Linux中的分段错误
这里是我的代码:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int i;
char weather_value;
char weather_incoming[2000];
FILE *in;
in=fopen("home/pi/weather_project/weather_incoming.txt","r");
for(i=0;i<2000;i++)
{
fscanf(in,"%c",&weather_incoming[i]);
}
char* tagStartBegin = strstr(weather_incoming,"<pty");
char* tagStartEnd = strstr(tagStartBegin,">");
char* value = tagStartEnd+1;
char* tagEndBegin = strstr(tagStartEnd,"</pty>");
*tagEndBegin = '\0';
weather_value=*value;
printf("%c",weather_value);
fclose(in);
}
我必须找到从txt文件的天气值,<pty>
和一个人帮我这个之间。当我在windows(codeblocks)上编译它时,它工作得很完美,但是当我在linux(gcc)上编译它时,它一直向我发送Segmentation Fault
。 我该如何解决这个问题? 我不知道什么部分是错误的任何信息,因为该错误信息只是Segmentation Fault
答
有几个问题与提供的代码:
- 你不检查是否
fopen
成功。如果您尝试打开的文件不存在,该怎么办? - 你循环盲目地阅读2000
fscanf
调用读取一个字符。如果文件包含少于2000个字符会怎么样? - 您传递非NUL终止的字符串到
strstr
,调用未定义的行为。 - 您不检查
strstr
是否成功。 - 如果您使用C89,则需要的
return
声明。
解决方案:
- 检查
fopen
的返回值。如果是NULL
,则打开失败。如果是这种情况,你应该采取必要的行动。 - 而不是盲目迭代2000次,直到
fscanf
失败(这发生在fscanf
返回EOF
)或最大缓冲区大小已达到时。请注意,有更好的方法来阅读而不是逐字阅读。 - 你应该循环后NUL终止你的数组。请注意,您需要为此预留一个额外的空间。
- 检查
strstr
的返回值。如果是NULL
,则表示strstr
未能在干草堆中找到针。如果是这种情况,你应该采取必要的行动。 - 在
main
的末尾加上return EXIT_SUCCESS;
。并且main
的标准格式之一是int main(void)
,而不是int main()
。
+0
我还会在'main()'中添加一个关于缺少返回值的项目符号... – dragosht
+0
完成:-)谢谢! –
你应该使用一个调试器(在Linux上,有gdb)。 –
代码有很多问题。文件句柄'in'将是错误的,你正在尝试读取它。你确定'家'而不是'/家'? – Jeyaram
用char'fscanf()'读取char文件看起来很奇怪。我敢打赌,你的错误与此有关。改为使用'fread()',并在一个读取语句中读取整个文件。我想这会做到这一点。 – oysteijo