2009-10-21 101 views
2

這裏學習C時主要的腦凍結。如何檢查值是否與字符串匹配

我在這裏有一個結構的東西,如:

char *sname; 
........ 
players[i].sname 

等於 「詹姆斯」。

我需要像這樣的值之間檢查平等:

if (players[i].sname == 'Lee') 

,但我運氣不好。是否有我應該使用的str函數,或者無論如何修復我的if語句。這不是atm工作。

+3

請注意,您需要使用雙引號字符串而不是單引號多字符常量。 – 2009-10-21 02:27:12

+0

是的 - 我會留下來讓別人學習我的設想。 – 2009-10-21 03:27:40

+0

請注意,有一個本質上重複的問題[我如何正確比較字符串在C](http://stackoverflow.com/questions/8004237/how-do-i-properly-compare-strings-in-c)這是在此之後幾年問。還有[爲什麼'strcmp()'當它的輸入相等時返回0](http://stackoverflow.com/questions/595450/why-does-strcmp-return-0-when-its-inputs-are-equal ) – 2017-02-10 05:22:12

回答

7

簡短回答:strcmp()

長的答案:所以,你有這樣的:

if(players[i].sname == 'Lee') 

這是錯誤的在幾個方面。首先,單引號表示C中的「字符字面量」而不是「字符串字面量」。其次,更重要的是,"string1" == "string2"不比較字符串,它比較char *或指向字符的指針。它會告訴你兩個字符串是否存儲在相同的內存位置。這將意味着他們是平等的,但一個錯誤的結果並不意味着他們不等於

strcmp()將基本經歷和在串的每個字符比較,停在那不等於第一個字符,並返回兩個角色之間的差別(這就是爲什麼你必須說平等strcmp() == 0!strcmp()) 。

還請注意功能strncmp()memcmp(),它們與strcmp()類似,但更安全。

+0

非常感謝 - 我知道存在根本性錯誤。當你不知道哪個部分是錯誤的,很難真正查看它:P – 2009-10-21 02:45:33

8

您應該使用strcmp()

if (strcmp(players[i].sname, "Lee") == 0) { ... 

還要注意的是,在C字符串被雙引號括起來:""。單個字符被單引號包圍:''。我不確定你的編譯器可能會用'Lee'做什麼,但它幾乎肯定不是你想要的。

+0

編譯器可能會生成數字「0x004c6565」。我不確定多字節字符在C89中是否合法,但我很確定它們是C99的一部分。 – 2009-10-21 02:51:56

+0

多字符整數常量在C89及更高版本中是合法的,但它們的值是實現定義的。 ISO/IEC 9899:2011§6.4.4.4字符常量:_¶10...包含多個字符的整數字符常量的值(例如, ''ab''),或者包含不包含字符或轉義序列的值映射到單字節 執行字符,是實現定義的。 ......在C89中的措辭基本上是相同的。 (有趣的是,C89在初始描述中有一個'ab''的例子; C99和C11都刪除了多字符常量的早期例子。) – 2017-02-10 05:39:54

3

您會從標頭<string.h>尋找strcmp()

請注意,您需要一個字符串 - 'Lee'不是一個字符串,而是一個多字符常量,這是允許的但很少用到的,不僅僅是因爲該表示由編譯器定義,而不是C標準。

如果您正在尋找比較兩個字符串 - 調用指向他們firstsecond,那麼你就寫:

if (strcmp(first, second) == 0) // first equal to second 
if (strcmp(first, second) <= 0) // first less than or equal to second 
if (strcmp(first, second) < 0) // first less than second 
if (strcmp(first, second) >= 0) // first greater than or equal to second 
if (strcmp(first, second) > 0) // first greater than second 
if (strcmp(first, second) != 0) // first unequal to second 

這,在我看來,這使得它清楚的比較等符號應該使用。請注意,strcmp()可能會返回任何負值以指示「小於」或任何正值來指示「大於」。

謹慎使用strncmp()而不是strcmp(),這是在一個答案中提出的。如果您有:

if (strncmp(first, "command", 7) == 0) 

那麼如果first包含"commander",本場比賽將是有效的。如果這不是你想要什麼,但你想使用strncmp()無論如何,你可以這樣寫:

if (strncmp(first, "command", sizeof("command")) == 0) 

這將正確地拒絕"commander"

相關問題