[英]How do I check if a value matches a string
我在這里有一個結構,類似於:
char *sname;
........
players[i].sname
相當於“詹姆斯”。
我需要像這樣檢查值之間的相等性:
if (players[i].sname == 'Lee')
但我運氣不佳。 是否有我應該使用的str*
函數,或者是否可以修復我的if
語句?
簡短的回答: strcmp()
。
長答案:所以你有這個:
if(players[i].sname == 'Lee')
這在幾個方面都是錯誤的。 首先,單引號在 C 中表示“字符文字”而不是“字符串文字”。
其次,更重要的是, "string1" == "string2"
不比較字符串,它比較char *
s,或指向字符的指針。 它會告訴您兩個字符串是否存儲在同一個內存位置。 這意味着它們是平等的,但錯誤的結果並不意味着它們是不平等的。
strcmp()
基本上會遍歷並比較字符串中的每個字符,在第一個不相等的字符處停止,並返回兩個字符之間的差異(這就是為什么你必須說strcmp() == 0
或!strcmp()
表示相等)。
您應該使用strcmp()
:
if (strcmp(players[i].sname, "Lee") == 0) { ...
另請注意,C 中的字符串用雙引號括起來: ""
。 單個字符用單引號括起來: ''
。 我不確定您的編譯器可能會對'Lee'
做什么,但這幾乎肯定不是您想要的。
您會從頭文件<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()
可以返回任何負值來表示“小於”或任何正值來表示“大於”。
你會找到喜歡的人:
if (strcmp(first, second)) // first unequal to second
if (!strcmp(first, second)) // first equal to second
IMO,它們具有簡潔的優點,但缺點是不如與零的顯式比較清晰。 天啊。
謹慎使用strncmp()
而不是strcmp()
,這是在一個答案中建議的。 如果你有:
if (strncmp(first, "command", 7) == 0)
那么如果first
包含"commander"
,則匹配將有效。 如果這不是你想要的,但無論如何你想使用strncmp()
,你會寫:
if (strncmp(first, "command", sizeof("command")) == 0)
這將正確拒絕"commander"
。
strcmp 工作正常,前提是其中一個字符串以空字符結尾。 如果兩者都是最大長度且相同,則比較將結束,並且很可能會為相等性測試提供假陰性結果。 如果一個字符串被固定在 strcmp 本身的 "" 標記內,那不是問題,因為我們知道它是空終止的。
如果我們正在比較兩個字符串變量,並且我們不知道它們是否是最大長度(最大長度的不是空終止),那么我們需要使用 strncmp,並在其中之一上使用 sizeof 來獲取第三個參數. 這解決了問題,因為 sizeof 知道最大長度。 如果字符串之一是雙引號中的文字,則 strcmp 是 100% 安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.