2012-03-07 66 views
3

在當前代碼庫我看着有,至少,這些:檢查C中空字符串的習慣方法?

  • if(strlen(str) == 0)
  • if(str[0] != 0)
  • if(!*str)

與同類變種它是空/不爲空。第一個更好,但可能會浪費時間(這可能也可能不重要)。我想可以製作一個#define STR_EMPTY(str) (*(str) == 0)宏。

但無論如何,是否有一個共同商定的方式來檢查C中的字符串是否爲空(not)?

+0

如果str的值在手之前未知(無論是否爲空),那麼應該將兩個和三個結合起來。 (你可能知道,只是想我應該把它扔出去。) – Corbin 2012-03-07 21:56:25

+4

我完全鄙視那樣的宏。爲什麼讓別人去查看一個宏,看看它自己包裝的代碼是完全清楚的呢? – 2012-03-07 21:57:25

回答

4

不,我見過所有這三個。就個人而言,我用

if (!str[0]) 

使用的strlen是處理器浪費時間,而不是安全的,除非你能保證該字符串被終止。

+3

那麼,如果它沒有終止,你的方法也不起作用。事實上,如果字符串沒有終止,它永遠不會是空的,因爲根據定義,空字符串只包含終止字符。 – 2012-03-07 21:55:24

+0

問題是確定字符串是否爲空,而不是終止。 – 2012-03-07 21:59:07

+4

如果未終止,則不是字符串。 – nos 2012-03-07 22:00:47

0

你所有的例子都很好。應該清楚的是,所有這三者都在您的代碼庫中,因此沒有「共同商定的」方法。

+0

你可能是對的。但是,這感覺就像通過查看一個代碼庫來代替CamelCase和lowercase_with_undercores,不需要編碼風格。 – user1255770 2012-03-07 21:57:21

+0

可能沒有。駱駝案件與下劃線之間也沒有達成共識。只需選擇一個。 – 2012-03-07 21:57:57

+0

不過,如果你看到數百萬種不同的方法來做同樣的事情,你會懷疑 – perreal 2012-03-07 21:58:42

0

我肯定會去strlen(str) == 0,只是爲了清楚。

的功能應該執行這樣的事情:

int strlen(char *s) { 
    int len = 0; 
    while(*(s++)) len++; 
    return len; 
} 

所以不會有大的開銷。

編輯:假設您確定該字符串實際上是零終止。

+2

沒有大的開銷?如果字符串是千字節甚至兆字節,會怎麼樣?你最終做1000或數百萬增量,指針去引用和比較與單個比較。 – 2012-03-07 22:01:50

+0

這是我會避免的。想象一下,你不小心用2GB的字符串來稱呼它。在一個緊密的循環中。 – 2012-03-07 22:03:04

+0

是的,我真的沒有想到這一點,我只是假設大部分時間字符串都是零。如果您正在查看大量數據,(str [0] == 0)肯定更快更安全。 – xato 2012-03-07 22:17:37

3
  1. if(strlen(str) == 0) - >它將崩潰如果str==NULL(你需要使用strlen前檢查)
  2. if(str[0] != 0) - >同上
  3. if(!*str) - >這實際上是做同樣的事情爲2)

總結:如果你想安全地做到這一點:

if(!str || !(*str)) { /* empty string or NULL */ } 
+0

你的意思是:'if(!str ||!* str){...}'? – wildplasser 2012-03-07 22:00:52

+1

我的意思正是我寫的:你寫的和我寫的完全一樣(paranthesis沒有任何區別)。 – sirgeorge 2012-03-07 22:03:40

+0

空字符串與空指針不同。事實上,我會將你的'||'改成'&&',以確保你只執行'if'的主體,如果你確實有一個字符串開頭的話。 – Marlon 2012-03-07 22:04:19

1

如果你已經知道str是非空:

if (!*str) { 
    // empty string 
} 

否則:

if (!str || !*str) { 
    // empty string 
} 

忘記strlen()