2016-03-01 2 views
-1

Когда я скомпилировал код и запустил его, он говорит 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); 
} 

Я должен найти значение погодного из текстового файла, между <pty> и </pty> Парень помог мне об этом. Когда я скомпилировал его на windows (codeblocks), он работал отлично, но когда я скомпилировал его на linux (gcc), он продолжает отправлять мне Segmentation Fault. Как я могу это исправить? я не знаю, какой-либо информации о том, что часть является неправильной, поскольку сообщение об ошибке было только Segmentation Fault

+9

Вы должны использовать отладчик (на Linux, есть gdb). –

+6

Есть много проблем с кодом. Файл дескриптор 'in' будет неправильным, и вы пытаетесь его прочитать. Вы уверены, что 'home' вместо'/home' ?? – Jeyaram

+3

Очень странно читать файл char с помощью char 'fscanf()'. Я могу поспорить, что ваша ошибка связана с этим. Вместо этого используйте 'fread()' и прочитайте весь файл в одном объявлении. Думаю, это будет трюк. – oysteijo

ответ

4

Есть несколько вопросов, с кодом, приведенным:

  1. Вы не проверить, если fopen удалось. Что делать, если файл, который вы пытаетесь открыть, не существует?
  2. Вы зацикливаете, чтобы читать вслепую, делает 2000 fscanf звонков, чтобы прочитать символ. Что делать, если файл содержит менее 2000 символов?
  3. Вы передаете строку, не связанную с NUL, до strstr, вызывая Undefined Behavior.
  4. Вы не проверяете, удалось ли выполнить strstr.
  5. Если вы используете C89, вам понадобится инструкция return для main.

Решения:

  1. Проверить fopen, возвращаемого значения. Если это NULL, открытие не удалось. Вы должны предпринять необходимые действия, если это так.
  2. Вместо слепого повторения в 2000 раз, прочитайте до fscanf сбой (это происходит, когда fscanf возвращает EOF) или когда достигнут максимальный размер буфера. Обратите внимание, что есть лучшие способы чтения, а не чтение символа по символу.
  3. Вы должны NUL-завершить свой массив после цикла. Обратите внимание, что вам нужно зарезервировать дополнительное пространство для этого.
  4. Проверить возвращаемое значение strstr. Если это NULL, это означает, что strstr не удалось найти иглу в стоге сена. Вы должны предпринять необходимые действия, если это так.
  5. Добавить return EXIT_SUCCESS; в конце main. И одна из стандартных форм main - int main(void), а не int main().
+0

Я бы также добавил маркер о недостающем возвращаемом значении в 'main()' ... – dragosht

+0

Выполнено :-) Спасибо! –

Смежные вопросы