在C中 – 检查char数组中是否存在char

我试图检查一个字符是否属于无效字符的列表/数组。

来自Python的背景,我曾经可以说:

for c in string: if c in invalid_characters: #do stuff, etc 

我怎样才能做到这一点与常规C字符数组?

等效的C代码如下所示:

 #include <stdio.h> #include <string.h> // This code outputs: h is in "This is my test string" int main(int argc, char* argv[]) { const char *invalid_characters = "hz"; char *mystring = "This is my test string"; char *c = mystring; while (*c) { if (strchr(invalid_characters, *c)) { printf("%c is in \"%s\"\n", *c, mystring); } c++; } return 0; } 

请注意,invalid_characters是一个Cstring,即。 一个以null结尾的char数组。

C语言库中不太知名但非常有用的(自C89之后的标准,意思是“永远”)在C库中提供了一次调用的信息。 实际上,这有很多function – 财富的尴尬。 相关的是:

7.21.5.3 strcspn函数

概要

 #include <string.h> size_t strcspn(const char *s1, const char *s2); 

描述

strcspn函数计算s1指向的string的最大初始段的长度,它完全由不是由s2指向的string组成的字符组成。

返回

strcspn函数返回段的长度。

7.21.5.4 strpbrk函数

概要

 #include <string.h> char *strpbrk(const char *s1, const char *s2); 

描述

strpbrk函数定位s1指向的string中的第一个匹配项,该匹配项指向由s2指向的string中的任何字符。

返回

strpbrk函数返回一个指向字符的指针,如果s1中没有s2的字符出现,则返回一个空指针。

这个问题询问'对于string中的每个字符…如果它在无效字符列表中'。

有了这些function,你可以写:

 size_t len = strlen(test); size_t spn = strcspn(test, "invald"); if (spn != len) { ...there's a problem... } 

要么:

 if (strpbrk(test, "invald") != 0) { ...there's a problem... } 

哪个更好取决于你想做什么。 还有相关的strspn()函数,有时是有用的(白名单,而不是黑名单)。

假设你的input是一个标准的以空字符结尾的Cstring,你想使用strchr

 #include <string.h> char* foo = "abcdefghijkl"; if (strchr(foo, 'a') != NULL) { // do stuff } 

另一方面,如果你的数组不是空终止(即只是原始数据),你需要使用memchr并提供一个大小:

 #include <string.h> char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0' if (memchr(foo, 'a', sizeof(foo)) { // do stuff } 

处理Cstring时使用strchr函数。

 const char * strchr ( const char * str, int character ); 

这是你想要做的一个例子。

 /* strchr example */ #include <stdio.h> #include <string.h> int main () { char invalids[] = ".@<>#"; char * pch; pch=strchr(invalids,'s');//is s an invalid character? if (pch!=NULL) { printf ("Invalid character"); } else { printf("Valid character"); } return 0; } 

处理内存块时使用memchr(因为不是以null结尾的数组)

 const void * memchr ( const void * ptr, int value, size_t num ); /* memchr example */ #include <stdio.h> #include <string.h> int main () { char * pch; char invalids[] = "@<>#"; pch = (char*) memchr (invalids, 'p', strlen(invalids)); if (pch!=NULL) printf (p is an invalid character); else printf ("p valid character.\n"); return 0; } 

http://www.cplusplus.com/reference/clibrary/cstring/memchr/

http://www.cplusplus.com/reference/clibrary/cstring/strchr/

你要

strchr(const char * s,int c)

如果字符c在strings中,则返回一个指向s中位置的指针。 否则,它返回NULL。 所以只要使用无效字符的列表作为string。

strchr从开始search字符(从最后的strrchr ):

  char str[] = "This is a sample string"; if (strchr(str, 'h') != NULL) { /* h is in str */ } 

我相信原来的问题说:

一个字符属于无效字符的列表/数组

并不是:

属于以空字符结尾的string

如果是这样,那么strchr确实是最合适的答案。 但是,如果对字符数组没有空终止或者字符在列表结构中,则需要创build一个以空字符结尾的string并使用strchr或手动遍历集合中的元素,检查每个轮stream。 如果集合很小,那么线性search就可以了。 大集合可能需要更合适的结构来提高search时间 – 例如,sorting数组或平衡二叉树。

select最适合你的情况。