我正在尝试检查一个字符是否属于无效字符的列表/数组。
来自Python背景的我过去常常可以说:
for c in string:
    if c in invalid_characters:
        #do stuff, etc我如何使用常规的C字符数组来做到这一点?
发布于 2009-07-01 21:50:41
等效的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是一个C字符串,即。以null结尾的char数组。
发布于 2009-07-01 23:07:09
C库中不太知名但非常有用的(和标准的,因为C89 -意思是“永远”)函数在一次调用中提供了信息。实际上,它有多个功能--一个令人尴尬的财富。与此相关的是:
7.21.5.3 strcspn函数
提要
#include size_t strcspn(const char *s1,const char *s2);
描述
strcspn函数计算s1所指向的字符串的最大初始段的长度,该字符串完全由字符组成,而不是来自于s2所指向的字符串。
返回
函数的作用是:返回数据段的长度。
7.21.5.4 strpbrk函数
提要
#include char *strpbrk(const char *s1,const char *s2);
描述
strpbrk函数定位s2指向的字符串中s1指向的字符串中任何字符的第一个匹配项。
返回
strpbrk函数返回一个指向字符的指针,如果s1中没有来自s2的字符,则返回一个空指针。
这个问题询问“对于字符串中的每个字符...如果它在无效字符列表中”。
使用这些函数,您可以编写:
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()函数,它有时很有用(白名单而不是黑名单)。
发布于 2009-07-01 21:50:26
假设您的输入是一个标准的以null结尾的C字符串,您希望使用strchr
#include <string.h>
char* foo = "abcdefghijkl";
if (strchr(foo, 'a') != NULL)
{
  // do stuff
}另一方面,如果您的数组不是以null结尾的(即仅原始数据),则需要使用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
}https://stackoverflow.com/questions/1071542
复制相似问题