我有一個函數,它需要一個可變長度和長度的char *。 我想檢查它的內容是否都是空格。可變長度字符串內容的非遞歸檢查
這是一個可變長度的,意味着我不能使用memcmp,因爲我不知道過了多久,使第二個參數。
任何想法用一個簡潔的方式來檢查它迭代遍歷字符串的每個字符?
我有一個函數,它需要一個可變長度和長度的char *。 我想檢查它的內容是否都是空格。可變長度字符串內容的非遞歸檢查
這是一個可變長度的,意味着我不能使用memcmp,因爲我不知道過了多久,使第二個參數。
任何想法用一個簡潔的方式來檢查它迭代遍歷字符串的每個字符?
一個合理有效的方式來回答這個確切的要求是:
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。
剛剛走過去的字符和檢查的空格(例如,使用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風格的字符數組。
'\ n'也是一個空格。 – Donotalo 2011-04-27 10:08:31
'\ v'也是一個空格。 – 2011-04-27 10:16:25
@Martin根據語言環境,是的。我應該明確指出,這只是一個概念證明。 – 2011-04-27 10:19:14
如果您想知道某個字符串中的某個字符是否具有特定的值,並且您想知道該字符串中的所有字符,您需要需要來迭代該字符串。沒辦法。即使memcmp
在字符串上循環,它只是隱藏起來。
編輯:想我會提供一個簡單的實施可變長度字符串:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
當然,對於空終止字符串這只是工作,但應該是一個給定的。
在使用':: isspace'函數之前將'char'轉換爲無符號類型。 – 2011-04-27 10:43:40