2011-05-10 30 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 的初始段,其完全由 字符不是拒绝中的。

相关问题