2013-10-22 42 views
0

我有一堆字符串,我需要驗證,如果這些都有空格。如何確保字符串在給定長度內充滿空間?

我可以做strlen(trim(strct.data)) > 0

但是,它不空值終止,但長度已知

即,如果strct.len是5,那麼我需要驗證strct.data是否有5個字符的空格。第6個字符不能保證爲空。我有一個數組strct,每個數據可以有不同長度的數據來驗證空間。

我試過strnlen(trim(strct.data))後來意識到它沒有修復任何東西,因爲修剪已經刪除了所有空格。

除了每個字符strct.data(我最後的選擇,如果沒有其他的去)明顯循環以外的任何想法?

注意:trim是一個用戶定義的函數,用於刪除前導和尾隨空格。直到NULL也不停止。我正在尋找一種方法來處理兩者。

+1

如果'data'不是'NUL'終止,'trim()'如何知道何時停止? – jxh

+0

是否有*理由*您沒有使用NULL終止的字符串?沒有這一點,你需要自定義代碼來處理任何「字符串」操作,並傳遞整個結構或「字符串」和長度。 – crashmstr

+0

難道你不能修改修剪以返回刪除的空格數量嗎?無論如何,修剪必須走字符串。 – Henno

回答

1

如何確保該字符串是充滿空間對於一個給定長度是多少?

步驟1:

char buf[MAX_SIZE]; 
    sprintf(buf,"%*s",MAX_SIZE-1,""); //fill buffer with spaces 

步驟2:

現在使用strncmp()比較strct.data字符陣列的字符的數目strct.len與buf

if(strncmp(strct.data ,buf ,strct.len) ==0) 
    { 
    //all are spaces 
    } 

您無需重複step1。


另一種解決方案JXH建議你也可以使用memset()代替sprintf()

memset(buf, ' ', sizeof buf); //fill buf with all spaces 

您需要此一次,下一次起你不必這樣做。


您也可以使用VLA。

申報char buf[strct.len];

但是您需要每次使用memset。

+1

你可以在緩衝區使用'memset()',並且你可以使用VLA做'char buf [strct.len]',並使用'memcmp()'。 – jxh

+0

是的好點。 – Gangadhar

1

也許最好是做自己的循環:

for(int i=0; i<strct.len; ++i) { 
    if(strct[i] != ' ') { 
    return false; 
    } 
} 
return true; 
+0

正如我所說,如果沒有其他更好的方法,我會選擇它 – San

+1

無論如何,你的裝飾必須迭代字符串,可能你已經有了你需要的數字 – Henno

+0

如果一個新的func使用'strct.len'來處理修剪,你應該已經知道它已經有了編號 – San

1

由於字符數組不爲空終止,它不是一個
但是讓我們不要在這一點上狡猾,併爲大型數組做一個快速例程。

IsCharArrayAllSpace(const char *p, size_t Length) { 
    if (Length < 1) return 1; // TBD: decide how to handle the zero-length case 
    return (p[0] == ' ') && (memcmp(p, &p[1], Length-1) == 0); 
} 
相關問題