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

Ama*_*rok 46 c arrays string char

我正在尝试检查一个字符是否属于无效字符的列表/数组.

来自Python背景,我曾经只能说:

for c in string:
    if c in invalid_characters:
        #do stuff, etc
Run Code Online (Sandbox Code Playgroud)

如何使用常规C char数组执行此操作?

Jon*_*ler 44

C库中较不为人知但非常有用的(以及C89以来的标准 - 意为"永远")功能在一次调用中提供信息.实际上,有多种功能 - 财富的尴尬.相关的是:

7.21.5.3 strcspn函数

概要

#include <string.h>
size_t strcspn(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)

描述

strcspn函数计算s1指向的字符串的最大初始段的长度,该段完全由不是来自s2指向的字符串的字符组成.

返回

strcspn函数返回段的长度.

7.21.5.4 strpbrk函数

概要

#include <string.h>
char *strpbrk(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)

描述

strpbrk函数定位s1指向的字符串中s1指向的字符串中第一个出现的字符串.

返回

strpbrk函数返回指向该字符的指针,如果在s1中没有出现s2中的字符,则返回空指针.

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

有了这些功能,你可以写:

size_t len = strlen(test);
size_t spn = strcspn(test, "invald");

if (spn != len) { ...there's a problem... }
Run Code Online (Sandbox Code Playgroud)

要么:

if (strpbrk(test, "invald") != 0) { ...there's a problem... }
Run Code Online (Sandbox Code Playgroud)

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

  • 令人惊讶的是有多少人建议`strchr`!`strpbrk`显然是理想的解决方案. (4认同)
  • 这实际上应该是公认的答案!C也不是完全没有电池... (2认同)

Ric*_*dle 31

等效的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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,invalid_characters是一个C字符串,即.以null结尾的char数组.

  • 尽量不要挑剔,但如果它在C中,你不应该用等效的printf()调用替换std :: cout吗?或者至少存在于C中的某些东西? (2认同)
  • 尽管使用strchr()的循环有效,但我认为最好在用户代码中使用'strcspn()'或`strpbrk()`而不使用循环. (2认同)

Dav*_*veR 25

假设您的输入是标准的以null结尾的C字符串,您希望使用strchr:

#include <string.h>

char* foo = "abcdefghijkl";
if (strchr(foo, 'a') != NULL)
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您的数组不是以空值终止的(即只是原始数据),则需要使用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
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 5

处理C字符串时使用strchr函数.

const char * strchr ( const char * str, int character );
Run Code Online (Sandbox Code Playgroud)

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

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

处理内存块时使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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