2016-09-26 49 views
1

我在比較C中兩個相同的字符串時遇到了問題。使用方法strcmp()時,比較文本文件中的一行到用戶輸入時似乎存在問題。爲什麼即使用戶輸入與文本文件相同,strcmp()也會返回-1。如何在C中使用strcmp將用戶輸入與文本文件進行比較?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct Person{ 
    char fName[10]; 
    char lName[10]; 
}; 

char inputUser[10]; 

int main() 
{ 
    FILE *file; 
    int ret; 
    char data[20]; 

    file = fopen("file.txt", "r"); 
    struct Person *p1 = malloc(sizeof(struct Person)); 
    gets(inputUser); 

    strcpy(p1->fName , inputUser); 
    struct Person *p2 = malloc(sizeof(struct Person)); 

    while (fgets(data , 20 , file) != NULL){ 
     strcpy(p2->fName , data); 
     ret = strcmp(p1->fName, p2->fName); 
     printf("\t%d\t%s\t%s\n", ret , p1->fName, p2->fName); 
    } 
    fclose(file); 
    file = fopen("file.txt","a"); 
    fprintf(file, "%s\n", p1->fName); 
    fclose(file); 

} 
+2

你有沒有考慮將*換行*問題阿?用'gets'和'fgets'?爲什麼不使用'fgets(inputUser,20,stdin)'而不是'gets(inputUser)'? – dvhh

+3

您的問題需要樣本輸入,預期輸出和實際輸出,然後纔是[mcve]。 –

+1

請注意,fgets的輸入結果將包括尾隨換行符。如果換行符存在,則刪除換行符。 – BLUEPIXY

回答

0

gets(inputUser)後補充一點:

inputUser[strlen(inputUser)-1] = '\0'; 

,將刪除字符串的最後一個字符。 gets()記錄用戶輸入的換行符(回車鍵)。這就是爲什麼strcmp()不認爲它們是相同的東西,因爲換行符。

此外,爲避免分段錯誤,你應該改變gets(inputUser)到:

fgets(inputUser, sizeof(inputUser), stdin); 

這確實只是第二個參數一樣的東西限制了可讀取的數據的長度。使用gets()時,如果輸入10個字符以存儲爲10個字符的字符串,則會發生分段錯誤。 !

+2

'inputUser [strlen(inputUser)-1] ='\ 0';'足以學習程序,但允許黑客利用用戶輸入空字符作爲輸入的第一個字符。這會導致'inputUser [(size_t)-1] ='\ 0';'這是UB,可能是一個例外。建議http://stackoverflow.com/a/28462221/2410359 – chux

+2

'fgets(inputUser,sizeof inputUser,stdin);'不是問題。 'fgets()'不需要'-1'來避免seg錯誤。 – chux

0

只需更換

strcpy(p2->fName , data); 
    ret = strcmp(p1->fName, p2->fName); 

通過

strcpy(p2->fName , strtok(data, "\n")); 
    ret = !strcmp(p1->fName, p2->fName); 
  • STRCMP(A,B)返回true(1)如果A等於B.否則返回false(0);
  • 的strtok(A,B)返回無子B.
相關問題