2011-04-27 113 views
1

我有一個函數,它需要一個可變長度和長度的char *。 我想檢查它的內容是否都是空格。可變長度字符串內容的非遞歸檢查

這是一個可變長度的,意味着我不能使用memcmp,因爲我不知道過了多久,使第二個參數。

任何想法用一個簡潔的方式來檢查它迭代遍歷字符串的每個字符?

回答

2

一個合理有效的方式來回答這個確切的要求是:

bool is_whitespace(const char* p, size_t n) 
{ 
    while (n--) 
     if (!isspace(static_cast<unsigned char>(*p++))) 
      return false; 
    return true; 
} 

更一般地,這是一個好主意,試圖這樣的數據存儲在std::string變量,這使得解決方案,如康拉德的find_first_not_of更加高效,便捷。

*感謝Steve對某些非ASCII字符串內容平臺上的評論和評論。 http://msdn.microsoft.com/en-us/library/ms245348.aspx

+0

在使用':: isspace'函數之前將'char'轉換爲無符號類型。 – 2011-04-27 10:43:40

4

剛剛走過去的字符和檢查的空格(例如,使用isspace功能)。

或者,將char*轉換爲std::string並使用字符串函數,即find_first_not_of。例如,使用「傳統的」空白字符在預Unicode編碼:

bool is_all_spaces(char const* text, unsigned len) { 
    string str(text, len); 
    return str.find_first_not_of(" \t\r\n\v\f") == string::npos; 
} 

更花式空白識別將與任意的文本編碼/區域設置處理。因此,使用isspace可能會優於find_first_not_of方法。

在這兩種情況下,使用C++ memcmp反正是不明智的,你一般應更喜歡C++字符串C風格的字符數組。

+0

'\ n'也是一個空格。 – Donotalo 2011-04-27 10:08:31

+0

'\ v'也是一個空格。 – 2011-04-27 10:16:25

+0

@Martin根據語言環境,是的。我應該明確指出,這只是一個概念證明。 – 2011-04-27 10:19:14

2

如果您想知道某個字符串中的某個字符是否具有特定的值,並且您想知道該字符串中的所有字符,您需要需要來迭代該字符串。沒辦法。即使memcmp在字符串上循環,它只是隱藏起來。
編輯:想我會提供一個簡單的實施可變長度字符串:

bool is_only_space(const char* str){ 
    while(*str != '\0'){ 
    if(*str != ' ') 
     return false; 
    ++str; 
    } 
    return true; 
} 

當然,對於空終止字符串這只是工作,但應該是一個給定的。

+0

認爲可能是這種情況,謝謝 – matt 2011-04-27 10:10:21

+0

@matt:爲可變長度字符串添加了一個簡單示例。 – Xeo 2011-04-27 10:28:08