2011-05-10 26 views
2

檢查C中的字符串是否僅由空格組成的最有效/最安全的方法是什麼?我是否需要自己編寫一個函數來檢查或者string.h中是否有一個我可以使用的函數?檢測字符串是否由空格組成?

+1

要小心'is' \ *函數:它們**要求**將它們的參數轉換爲'unsigned char'。見[C99標準]中的7.4/1(http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)。 – pmg 2011-05-10 13:43:20

回答

5

好,寫你自己的很簡單:你的標準庫使用

int IsSpaces(char * s) { 

    while (* s) { 
     if (! isspace(* s)) { 
      return 0; 
     } 
     s++; 
    } 
    return 1; 
} 

什麼不太可能是更有效的。

+6

沒有冒犯的unapersson,但我覺得你的編碼風格很難閱讀。 – orlp 2011-05-10 13:38:57

+0

@night對不起,它實際上已經開發了多年,教人們C和C++要儘可能清晰。 – 2011-05-10 13:40:03

+1

似乎很難讀懂的唯一部分是圓括號內容周圍的空間。我不確定這是如何使它更容易閱讀;它似乎在分裂合乎邏輯的事情。 – 2011-05-10 13:42:18

1

當你說空間時,你的意思是還是空格字符?

但是,沒有這樣的功能,這個工作雖然:

int isonlyspaces(char *str) { 
    while (*str++ == ' '); 
    return --str == '\0'; 
} 

如果平均間隔字符,而不是字面的空間,這個版本是合適的:

int isonlyspaces(char *str) { 
    while (isspace(*str++)); 
    return --str == '\0'; 
} 
+0

轉換isspace參數以避免UB:'isspace((unsigned char)* str ++)'。 – pmg 2011-05-10 13:46:36

+0

@pmg:AFAIK'isspace'被定義爲一個整數,所以不會有任何問題。 – orlp 2011-05-10 13:47:51

+0

你確定'char'是無符號的嗎? ...'char * buf =「JoséPeña」;' – pmg 2011-05-10 13:50:15

5

試試這個:

if (!s[strspn(s, " ")]) /* it's all spaces */ 

如果您還想在「空格」的定義中包含選項卡,換行符等,SIM卡將它們添加到strspn的第二個參數。

+0

可能值得評論,你將索引尾隨\ 0字節IFF的跨度是整個長度,因此! '\ 0'將是真實的。 – Roboprog 2011-05-10 13:56:35

1

man string.h將我帶到以下manpage。

NAME strspn,strcspn - 搜索字符串對一組字符

概要

#include <string.h> 

    size_t strspn(const char *s, const char *accept); 

    size_t strcspn(const char *s, const char *reject); 

說明的

  • 的strspn()函數計算 長度的初始的s 的段完全由字符 組成PT。

  • 的strcspn()函數計算 長度s 的初始段,其完全由 字符不是拒絕中的。

相關問題