2014-02-09 56 views
1

我在運行代碼時出現Segmentation Fault(核心轉儲)錯誤。在使用了一些printf語句之後,我發現strcmp部分有錯誤,也許是因爲比較字符串和字符串?我該如何解決?在C中使用strcmp的分割錯誤?

// 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()(即strlen(substring))。 –

+3

這個:'if(buff == NULL)break;'will * never * cause a break;使用'if(fgets(buff,sizeof buff,file)== NULL)break;'在'strcmp'中使用它們之前,你也不會檢查'strstr'的​​結果。 – WhozCraig

+0

和'strcmp'和'strstr'只有一個或其他重複。 – BLUEPIXY

回答

0

數組buff不是空終止。你需要做的是爲str...家庭的功能

PS:瞭解縮進代碼 PPS:使用調試器找到buff

0

值如果buffNULL終止,那麼問題會進來strcmp。在你的情況下,在聲明部分初始化buff變量(爲零)。否則檢查filesize,然後在buff添加NULL字符:

[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 *substringsubstring指着裏面的地方BUF如果沒有匹配substring指向NULL,當你這樣做strcmp(buff,substring)這將永遠是零。