簡體   English   中英

如何檢查值是否與字符串匹配

[英]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()表示相等)。

還要注意函數strncmp()memcmp() ,它們類似於strcmp()但更安全。

您應該使用strcmp()

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

另請注意,C 中的字符串用雙引號括起來: "" 單個字符用單引號括起來: '' 我不確定您的編譯器可能會對'Lee'做什么,但這幾乎肯定不是您想要的。

您會從頭文件<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()可以返回任何負值來表示“小於”或任何正值來表示“大於”。

你會找到喜歡的人:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM