Ошибка сегментации с использованием strcmp в C?

Я получал ошибку Segmentation Fault (дамп ядра) при запуске кода. После использования некоторого оператора printf я обнаружил, что в части strcmp есть ошибка, может быть, это связано с сравнением char со строкой? Как я могу это исправить?

// 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;    
}

person Gavin Z.    schedule 09.02.2014    source источник
comment
используйте strncmp() вместо strcmp(), т.е. strlen(substring).   -  person rakib_    schedule 09.02.2014
comment
Это: if(buff ==NULL) break; никогда не приведет к разрыву; Используйте if (fgets(buff, sizeof buff, file) == NULL) break; Вы также никогда не проверяете результаты strstr перед их использованием в strcmp.   -  person WhozCraig    schedule 09.02.2014
comment
и strcmp и strstr достаточно только одного или другого из дубликатов.   -  person BLUEPIXY    schedule 09.02.2014


Ответы (4)


У вас нет гарантии, что 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 символов, вы можете не найти строку.

person Joseph Quinsey    schedule 09.02.2014
comment
+1 (ожидал обнаружения CRLF). И я согласен с путаницей strstr/strcmp, я думаю strncmp сделал бы то, к чему стремится OP, но трудно сказать. - person WhozCraig; 09.02.2014

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

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

person Ed Heal    schedule 09.02.2014

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

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

person tesseract    schedule 09.02.2014

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

[filesize+1]='\0'.
person mahendiran.b    schedule 09.02.2014