2013-10-20 33 views
2

我試圖檢查從stdin讀取的行是否以「login:」開頭,但strcmp似乎不起作用。比較兩個字符串,strcmp的問題

char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n"); 

我不在乎「login:」後面會出現什麼內容,我只是想確保如何給出命令。我究竟做錯了什麼?

+1

'strcmp'用於**完全**匹配。我建議仔細閱讀[C字符串庫](http://en.cppreference.com/w/c/string/byte)以查看是否有另一個函數可用於此任務... –

+0

我正在複製第6個字符(應該是「login:」)到另一個字符串中,該字符串將與字符串「login:」進行比較,因此我要進行完全匹配。 –

+0

哦,這是一個公平點;我沒有注意到這一點。 –

回答

5

strcmp返回0,如果兩個字符串是完全一樣的來完成你想做的事

用途:

strstr(s2 , "login:")

(它返回NULL如果字符串不存在s2

strncmp(s2 , "login:" , 6)

這將前6個字符比較(如果s2開頭爲「登錄」,則返回0)

1

用C每串之後是一個空終止子,其示出了

當發生字符串結尾。

現在,你從S1複製6個字母轉化爲s2,這是

login: 

這意味着你沒有抄襲空終止。

因此s2並不完全符合您的要求。

所以我建議,而使用

strstr(s2, "login:") 

,以檢查是否登錄:包含在S2。

0
char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n"); 

您與「登錄」,其中包括以下字符比較你的字符串:「L'」 o''g''i''n「」:「」 \ 0' ,所以如果字符串應該是平等的在s2中必須有'\ 0'。以下代碼應該可以工作:

char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
s2[6]='\0'; //end of String 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n")