這裏學習C時主要的腦凍結。如何檢查值是否與字符串匹配
我在這裏有一個結構的東西,如:
char *sname;
........
players[i].sname
等於 「詹姆斯」。
我需要像這樣的值之間檢查平等:
if (players[i].sname == 'Lee')
,但我運氣不好。是否有我應該使用的str函數,或者無論如何修復我的if語句。這不是atm工作。
這裏學習C時主要的腦凍結。如何檢查值是否與字符串匹配
我在這裏有一個結構的東西,如:
char *sname;
........
players[i].sname
等於 「詹姆斯」。
我需要像這樣的值之間檢查平等:
if (players[i].sname == 'Lee')
,但我運氣不好。是否有我應該使用的str函數,或者無論如何修復我的if語句。這不是atm工作。
簡短回答:strcmp()
。
長的答案:所以,你有這樣的:
if(players[i].sname == 'Lee')
這是錯誤的在幾個方面。首先,單引號表示C中的「字符字面量」而不是「字符串字面量」。其次,更重要的是,"string1" == "string2"
不比較字符串,它比較char *
或指向字符的指針。它會告訴你兩個字符串是否存儲在相同的內存位置。這將意味着他們是平等的,但一個錯誤的結果並不意味着他們不等於。
strcmp()
將基本經歷和在串的每個字符比較,停在那不等於第一個字符,並返回兩個角色之間的差別(這就是爲什麼你必須說平等strcmp() == 0
或!strcmp()
) 。
非常感謝 - 我知道存在根本性錯誤。當你不知道哪個部分是錯誤的,很難真正查看它:P – 2009-10-21 02:45:33
您應該使用strcmp()
:
if (strcmp(players[i].sname, "Lee") == 0) { ...
還要注意的是,在C字符串被雙引號括起來:""
。單個字符被單引號包圍:''
。我不確定你的編譯器可能會用'Lee'
做什麼,但它幾乎肯定不是你想要的。
編譯器可能會生成數字「0x004c6565」。我不確定多字節字符在C89中是否合法,但我很確定它們是C99的一部分。 – 2009-10-21 02:51:56
多字符整數常量在C89及更高版本中是合法的,但它們的值是實現定義的。 ISO/IEC 9899:2011§6.4.4.4字符常量:_¶10...包含多個字符的整數字符常量的值(例如, ''ab''),或者包含不包含字符或轉義序列的值映射到單字節 執行字符,是實現定義的。 ......在C89中的措辭基本上是相同的。 (有趣的是,C89在初始描述中有一個'ab''的例子; C99和C11都刪除了多字符常量的早期例子。) – 2017-02-10 05:39:54
您會從標頭<string.h>
尋找strcmp()
。
請注意,您需要一個字符串 - 'Lee'
不是一個字符串,而是一個多字符常量,這是允許的但很少用到的,不僅僅是因爲該表示由編譯器定義,而不是C標準。
如果您正在尋找比較兩個字符串 - 調用指向他們first
和second
,那麼你就寫:
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"
。
請注意,您需要使用雙引號字符串而不是單引號多字符常量。 – 2009-10-21 02:27:12
是的 - 我會留下來讓別人學習我的設想。 – 2009-10-21 03:27:40
請注意,有一個本質上重複的問題[我如何正確比較字符串在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