2017-04-22 233 views
0

當我明確聲明一個字符串的值,然後將其與自身進行比較時,系統返回FALSE。這是否與系統添加的額外'\ 0'字符有關?我應該如何優化我的代碼才能使其成爲TRUE?C字符串長度

char name[5] = "hello"; 

if(name == "hello") 
{ 
    ... 
} 
+6

在C你不能比較這樣的字符串,你在做什麼是比較兩個*指針*永遠不會相等。閱讀['strcmp'](http://en.cppreference.com/w/c/string/byte/strcmp)瞭解如何比較字符串。另外,請記住,字符串需要*終止*。包含5個字符的字符串需要包含終止符的*六個*字符的空間。這兩個事實應該在任何[良好的初學者書](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)。 –

+1

如果你打算使用'name'作爲*字符串*,你需要'char name [6] =「hello」;''來保存''hello'(甚至更好'char name [] =「hello」;' 。爲什麼? (提示:你忘了'* 1'爲* nul-terminating *字符':)'如果你不打算使用'name'作爲*字符串,那麼你知道你不能使用任何'string.h'函數期望以* nul結尾的字符串*作爲參數。 –

+0

@ DavidC.Rankin我嘗試過'char name1 [] =「hello」;'然後'char name2 [] =「hello」;'最後'strcmp(name1,name2)'但仍然是FALSE。怎麼可以這麼簡單是如此令人沮喪... – reiallenramos

回答

5

你不能(有效)比較使用!===字符串,你需要使用strcmp這樣做的原因是因爲!===只會比較這些字符串的基址。字符串的不是內容。 不使用預定義的數組大小像char name[5] = "hello";而不是你可以使用char name[] = "hello";char name[6] = "hello";當使用

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

int main() 
{ 
char a[] = "hello"; 
char b[] = "hello"; 

    if (strcmp(a,b) == 0) 
     printf("strings are equal.\n"); 
    else 
     printf("strings are not equal.\n"); 

    return 0; 
} 
0

實際上,name是一個指向字符串「hello」地址的指針。你無法比較它們。所以你可以嘗試使用strcmp函數。還包括string.h庫。

喜歡:

strcmp(name,"hello"); 

也作爲註釋中的一個所指出的,採取的6字符數組包括「\0」。

希望有所幫助。

+0

_你不能比較他們 - 你可以! –

+0

我的意思是比較地址和字符串是沒有意義的比較。 –

1

如果兩個參數相等,則strcmp()返回0。

char name[]="hello"; 
if(strcmp(name,"hello") == 0) 
    return TRUE; 
else 
    return FALSE; 
+0

將'OP'定義的'name'傳遞給'strcmp()'會調用未定義的行爲,因爲'name' * * not *'0'-terminated。 – alk

+0

爲變量「名稱」添加了適當的定義 –

3

從我的評論繼續,你需要char name[6] = "hello";持有'hello(加上NUL終止字符)更妙的是,你可以使用

char name[] = "hello"; 

這將正確初始化name含有6-字符(包括空字節)。

所有string.h功能期待空終止字符串作爲參數時,他們採取char *const char *作爲傳遞給函數的參數。

最後,正如Anuvansh的回答中指出的那樣,您不能使用不等式條件來確定兩個字符串是否相等或不同。您或者使用正常的比較函數strcmp,strncmp,memcmp,或者您在每個字符串中停留在字符串不同的第一個字符處,或者在空字節處漫遊,如果這些字符串是相同的。

看看,讓我知道你是否還有其他問題。祝你好運,你的編碼。

0

在C中,數組名稱實際上是指向該數組的第一個元素的指針。

if(name == "hello") 

你比較字符串指針所以它會返回false

你可以看到相同的概念本文 why is array name a pointer to the first element of the array?

你可以簡單地包括「在:

你的情況

串。H」庫和使用的strcmp()函數

這樣的代碼:

char name[]="hello"; 

if(strcmp(name,"hello")==0){ 

..... 

} 

,使其真實姿態

+0

將您的代碼縮進4個字符以將其格式化爲代碼。 –

+0

「*您可以簡單包含庫*」在編譯期間不使用C庫,而是在*編譯後鏈接*。 *包括*用於編譯*是由庫提供的函數的* prototype/s *。 – alk