2016-03-01 78 views
-1

当我编译代码并运行它时,它说Segmentation FaultLinux中的分段错误

这里是我的代码:

#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

+9

你应该使用一个调试器(在Linux上,有gdb)。 –

+6

代码有很多问题。文件句柄'in'将是错误的,你正在尝试读取它。你确定'家'而不是'/家'? – Jeyaram

+3

用char'fscanf()'读取char文件看起来很奇怪。我敢打赌,你的错误与此有关。改为使用'fread()',并在一个读取语句中读取整个文件。我想这会做到这一点。 – oysteijo

回答

4

有几个问题与提供的代码:

  1. 你不检查是否fopen成功。如果您尝试打开的文件不存在,该怎么办?
  2. 你循环盲目地阅读2000 fscanf调用读取一个字符。如果文件包含少于2000个字符会怎么样?
  3. 您传递非NUL终止的字符串到strstr,调用未定义的行为。
  4. 您不检查strstr是否成功。
  5. 如果您使用C89,则需要的return声明。

解决方案:

  1. 检查fopen的返回值。如果是NULL,则打开失败。如果是这种情况,你应该采取必要的行动。
  2. 而不是盲目迭代2000次,直到fscanf失败(这发生在fscanf返回EOF)或最大缓冲区大小已达到时。请注意,有更好的方法来阅读而不是逐字阅读。
  3. 你应该循环后NUL终止你的数组。请注意,您需要为此预留一个额外的空间。
  4. 检查strstr的返回值。如果是NULL,则表示strstr未能在干草堆中找到针。如果是这种情况,你应该采取必要的行动。
  5. main的末尾加上return EXIT_SUCCESS;。并且main的标准格式之一是int main(void),而不是int main()
+0

我还会在'main()'中添加一个关于缺少返回值的项目符号... – dragosht

+0

完成:-)谢谢! –