2014-02-09 3 views
1

Когда я запускаю код, я получал ошибку сегментации (ядро дампа). После использования какой-либо инструкции printf я обнаружил, что в части strcmp есть ошибка, может быть, это потому, что сравнение символа с строкой? Как это исправить?Ошибка сегментации с использованием strcmp в C?

// this function checks if the file contains the *string 

bool checkIfMatch(char *string, FILE *file) { 

    while (true) { 

     char buff[1024]; 
     fgets(buff, sizeof buff, file); 
     if (buff == NULL) 
      break; 

     char *substring=strstr(buff, string); 
     if ((strcmp(buff, substring)) == 0) 
      return true; 
    } 

    return false;  
} 
+0

использовать strncmp() вместо strcmp() i.e strlen (подстрока). –

+3

Это: 'if (buff == NULL) break;' will * never * вызывает разрыв; Используйте 'if (fgets (buff, sizeof buff, file) == NULL) break;' Вы также никогда не проверяете результаты своей 'strstr' перед их использованием в' strcmp'. – WhozCraig

+0

и 'strcmp' и' strstr' достаточно только одного или другого дубликата. – BLUEPIXY

ответ

0

Масштаб buff не имеет отношения к делу. Вы должны сделать это для str... семейства функций

PS: Учитесь отступа код PPS: Используйте отладчик, чтобы найти ценности buff

0

если buff не NULL прекращается, то проблема будет зайдите в strcmp. В вашем случае инициализируйте переменную buff (до нуля) в части декларации. В противном случае проверьте filesize, а затем добавить NULL символ в buff:

[filesize+1]='\0'. 
1

У вас нет гарантии, что substring не является NULL. Таким образом, вы должны проверить:

bool checkIfMatch(char *string, FILE *file) { 
    char buff[1024]; 
    while (fgets(buff, sizeof buff, file)) { 
     char *substring=strstr(buff, string); 
     if (substring && !strcmp(buff, substring)) 
      return true; 
    } 
    return false; 
} 

Другие проблемы:

  • В коде if (buff == NULL) break; будет никогда вызвать разрыв. Вам необходимо проверить возвращаемое значение fgets. (См. Комментарий WhozCraig)

  • fgets сохраняет возврат каретки, что, вероятно, не является тем, что вы хотите.

  • Strstr/strcmp в замешательстве: вы, вероятно, просто хотите strcmp, или, может быть, просто strstr.

  • Если файл имеет длину более 1022 символов, вам может не пригодиться поиск строки.

+1

+1 (ожидал обнаружения CRLF). И я согласен с путаницей 'strstr' /' strcmp', я думаю, что '' strncmp' будет делать то, что OP собирается, но трудно сказать. – WhozCraig

+0

возвращает false, когда файл содержит строку. –

0
char *substring=strstr(buff, string); 
    if ((strcmp(buff, substring)) == 0) 
     return true; 

char *substring в том случае, если у вас есть матч, substring указывает на то внутри BUF если совпадение substring не указывает на NULL, и когда вы делаете strcmp(buff,substring) это никогда не будет равна нулю.

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