2016-03-01 74 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

完成:-)謝謝! –