在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; }
你要
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最适合你的情况。