在當前代碼庫我看着有,至少,這些:檢查C中空字符串的習慣方法?
if(strlen(str) == 0)
if(str[0] != 0)
if(!*str)
與同類變種它是空/不爲空。第一個更好,但可能會浪費時間(這可能也可能不重要)。我想可以製作一個#define STR_EMPTY(str) (*(str) == 0)
宏。
但無論如何,是否有一個共同商定的方式來檢查C中的字符串是否爲空(not)?
在當前代碼庫我看着有,至少,這些:檢查C中空字符串的習慣方法?
if(strlen(str) == 0)
if(str[0] != 0)
if(!*str)
與同類變種它是空/不爲空。第一個更好,但可能會浪費時間(這可能也可能不重要)。我想可以製作一個#define STR_EMPTY(str) (*(str) == 0)
宏。
但無論如何,是否有一個共同商定的方式來檢查C中的字符串是否爲空(not)?
不,我見過所有這三個。就個人而言,我用
if (!str[0])
使用的strlen是處理器浪費時間,而不是安全的,除非你能保證該字符串被終止。
那麼,如果它沒有終止,你的方法也不起作用。事實上,如果字符串沒有終止,它永遠不會是空的,因爲根據定義,空字符串只包含終止字符。 – 2012-03-07 21:55:24
問題是確定字符串是否爲空,而不是終止。 – 2012-03-07 21:59:07
如果未終止,則不是字符串。 – nos 2012-03-07 22:00:47
你所有的例子都很好。應該清楚的是,所有這三者都在您的代碼庫中,因此沒有「共同商定的」方法。
你可能是對的。但是,這感覺就像通過查看一個代碼庫來代替CamelCase和lowercase_with_undercores,不需要編碼風格。 – user1255770 2012-03-07 21:57:21
可能沒有。駱駝案件與下劃線之間也沒有達成共識。只需選擇一個。 – 2012-03-07 21:57:57
不過,如果你看到數百萬種不同的方法來做同樣的事情,你會懷疑 – perreal 2012-03-07 21:58:42
我肯定會去strlen(str) == 0
,只是爲了清楚。
的功能應該執行這樣的事情:
int strlen(char *s) {
int len = 0;
while(*(s++)) len++;
return len;
}
所以不會有大的開銷。
編輯:假設您確定該字符串實際上是零終止。
沒有大的開銷?如果字符串是千字節甚至兆字節,會怎麼樣?你最終做1000或數百萬增量,指針去引用和比較與單個比較。 – 2012-03-07 22:01:50
這是我會避免的。想象一下,你不小心用2GB的字符串來稱呼它。在一個緊密的循環中。 – 2012-03-07 22:03:04
是的,我真的沒有想到這一點,我只是假設大部分時間字符串都是零。如果您正在查看大量數據,(str [0] == 0)肯定更快更安全。 – xato 2012-03-07 22:17:37
if(strlen(str) == 0)
- >它將崩潰如果str==NULL
(你需要使用strlen
前檢查)if(str[0] != 0)
- >同上if(!*str)
- >這實際上是做同樣的事情爲2)總結:如果你想安全地做到這一點:
if(!str || !(*str)) { /* empty string or NULL */ }
你的意思是:'if(!str ||!* str){...}'? – wildplasser 2012-03-07 22:00:52
我的意思正是我寫的:你寫的和我寫的完全一樣(paranthesis沒有任何區別)。 – sirgeorge 2012-03-07 22:03:40
空字符串與空指針不同。事實上,我會將你的'||'改成'&&',以確保你只執行'if'的主體,如果你確實有一個字符串開頭的話。 – Marlon 2012-03-07 22:04:19
如果你已經知道str
是非空:
if (!*str) {
// empty string
}
否則:
if (!str || !*str) {
// empty string
}
忘記strlen()
。
如果str的值在手之前未知(無論是否爲空),那麼應該將兩個和三個結合起來。 (你可能知道,只是想我應該把它扔出去。) – Corbin 2012-03-07 21:56:25
我完全鄙視那樣的宏。爲什麼讓別人去查看一個宏,看看它自己包裝的代碼是完全清楚的呢? – 2012-03-07 21:57:25