2011-09-20 114 views
4

我有以下程序爲什麼在C中比較字符串不起作用?

main() 
{ 

    char name[4] = "sara"; 
    char vname[4] = "sara"; 

    if(strcmp(name, vname) == 0) 
    { 
     printf("\nOK"); 
    } 
    else 
    { 
     printf("\nError"); 
    } 

} 

這個程序總是打印「錯誤」 ......問題是什麼在這裏幫我

,但如果我改變焦炭VNAME [] =「薩拉」的話,那打印出「OK」...爲什麼?

+0

這不是特別相關的問題,但C++不允許'char name [4] =「sara」;';如果你指定了尺寸,你必須有足夠的空間放置尾部的'\'。 –

回答

19

您正在調整您的數組的大小,使它們對於字符串來說太短(它們不包含空終止符的附加字符)。結果,strcmp在進行比較時正在經過字符串的末尾,產生基本上不可預知的結果。你很幸運沒有得到賽格錯誤。

+11

如果他*得到了seg故障,他會更幸運。 –

+0

那麼你能告訴我什麼是最好的方式來分配一個字符串或在c中創建一個字符串?請參考 – srisar

+0

srisar:正如其他人所建議的那樣,您可以在數組聲明中省略顯式維值,編譯器將根據它們的初始值設定項(例如,char name [] =「sara」)來確定它們的大小。 – Jollymorphic

8

原諒我,如果這是偏離軌道,因爲我沒有做過年齡C!

main() 
{ 
    char name[] = "sara"; 
    char vname[] = "sara"; 

    if(strcmp(name, vname) == 0) 
    { 
     printf("\nOK"); 
    } 
    else 
    { 
     printf("\nError"); 
    } 
} 

你指定的硬盤長度爲你的字符數組,但在C中,字符串空終止,所以「薩拉」實際需要LEN 5,不是4

7

因爲namevname不包含字符串。通過爲每個字符指定4的大小,並以4個字符的字符串作爲初始值設定項,您告訴編譯器只存儲4個字符而不是'\0'空字符標記字符串的結尾。

行爲未定義;你(幸運的),它不只是崩潰。

取出4(或將其更改爲5):

char name[] = "sara"; 
char vname[] = "sara"; 

編輯:這裏有一個修復等幾個問題(見註釋)程序的修改版本。其他在namevname的聲明中省略4,大多數更改與您的問題沒有直接關係。

#include <stdio.h> /* needed for printf */ 
#include <string.h> /* needed for strcmp */ 

int main(void) /* correct declaration of "main" */ 
{ 

    char name[] = "sara"; /* omit 4 */ 
    char vname[] = "sara"; /* omit 4 */ 

    if (strcmp(name, vname) == 0) 
    { 
     printf("OK\n");  /* \n is at the *end* of the line */ 
    } 
    else 
    { 
     printf("Error\n"); /* as above */ 
    } 

    return 0; /* not absolutely required, but good style */ 
} 
1

這是因爲你不爲你的字符串分配足夠的空間(4個字節可以在字符串的結尾存儲「薩拉」的角色,而不是空字符。

strcmp走過字符串直到它到達一個nul字符,或者字符串的不同,然後,如果兩個字符串的nul都相等,那麼既然你沒有爲nul字符分配足夠大的數組,那麼你最終會得到你的兩個字符串是不相等的,實際上在大多數系統中,你可能會得到的名字是「sarasara」,vname只是「sara」,因爲vname在名字後面出現,所以很有可能將它們存儲在內存中並覆蓋名稱nul char。