2014-03-26 150 views
-8

我有問題,使用strncmp。據我看,理論上strncmp應該返回0如果兩個字符串比較的字符是相等的;然而,當我進行比較時,代碼會發生錯誤併產生誤判(不等於字符,仍然會產生if子句)。這裏的代碼:strncmp不工作,因爲它應該

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

int main(){ 
    char *frase1="some string"; 
    char *frase2="another string"; 
    char *frase3="some other string"; 

//Comparar frases desde inicio 
    if(strncmp(frase1, frase2, 200))printf("1<->2, 200 characters\n"); 
    if(strncmp(frase1, frase3, 20))printf("1<->3, 20 characters\n"); 
    if(strncmp(frase1, frase3, 4))printf("1<->3, 4 characteres\n"); 

    return 0; 
} 

如果字符串是相等的(至少比較字符),他們應該打印消息;如果不是,則什麼也不做;所以我仍然不明白爲什麼第一個條件成立。

任何想法?

+1

「在我閱讀時,如果兩個字符串比較的字符相等,理論上strncmp應該返回0。確實。你的問題是認爲'0'被認爲是真實的。 –

+0

請閱讀:http://ericlippert.com/2011/04/25/something-wrong-with-the-universe/ –

回答

1

strcmp & strncmp函數返回0如果字符串相等。你應該這樣做:

if (strncmp(frase1, frase3, 4) == 0) ... 

即:

char *str1 = "Example 1"; 
char *str2 = "Example 2"; 
char *str3 = "Some string"; 
char *str4 = "Example 1"; 

if (strncmp(str1, str2, 7) == 0) printf("YES\n"); // "Example" <-> "Example" 
else printf("NO\n"); 

if (strncmp(str1, str3, 2) == 0) printf("YES\n"); // "Ex" <-> "So" 
else printf("NO\n"); 

if (strcmp(str1, str4) == 0) printf("YES\n");  // "Example 1" <-> "Example 2" 
else printf("NO\n"); 

產生YESNOYES

0

如果字符串相等(至少是比較字符),應打印郵件

不,如果兩個字符串相等,它們不應該打印的信息,因爲strncmp回報0平等。由於最後一次檢查返回0,它不會被打印,而其他兩個不是零,即不平等,因此您會看到它們被打印。

strncmp的文檔應該給你更清晰。它返回

  • 0時LHS == RHS
  • < 0時LHS < RHS
  • > 0時LHS> RHS
0

的STRNCMP()函數返回零,如果字符串相等,否則爲非零值。所以,如果你比較兩個不相似的字符串,你會得到一個非零值,而非if語句,非零值是TRUE。所以,你需要做的是:

if(!strncmp(frase1, frase2, 200))printf("Mismo insulto no creo\n"); 
0

你應該做的strncmp() == 0的表達進行評估

工作代碼:

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

int main(){ 
char *frase1="some string"; 
char *frase2="another string"; 
char *frase3="some other string"; 

//Comparar frases desde inicio 
if(strncmp(frase1, frase2, 200) == 0) 
    printf("1<->2, 200 characters\n"); 
if(strncmp(frase1, frase3, 20) == 0) 
    printf("1<->3, 20 characters\n"); 
if(strncmp(frase1, frase3, 4) == 0) 
    printf("1<->3, 4 characteres\n"); 

return 0; 
} 
0

一個,它被認爲是很好的做法,以保持字符串和發佈示例代碼時使用英文標識符。可讀性勝過樂趣。

兩個,if塊得到執行,如果條件是true0的值被認爲是false,而任何值其他都被認爲是true

也就是說,您的問題不是strncmp(),而是關於真假的混淆。

相關問題