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

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

来自Python背景,我以前只能说:

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

我该如何使用常规C字符数组执行此操作?

Amarok asked 2020-06-27T00:42:33Z
7个解决方案
44 votes

C库中鲜为人知但极为有用的(也是C89的标准,自从C89以来一直是“永远”)的功能在一次调用中提供了信息。 实际上,有多种功能-致富的尴尬。 与之相关的是:

7.21.5.3 strcspn函数

概要

strspn()

描述

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

退货

strcspn函数返回段的长度。

7.21.5.4 strpbrk函数

概要

strspn()

描述

strpbrk函数可在字符串s1指向的字符串中找到第一个匹配项 s2指向的字符串中的字符。

退货

strpbrk函数返回指向字符的指针,如果没有字符则返回空指针 从s2发生在s1中。

该问题询问“对于字符串中的每个字符……是否在无效字符列表中”。

使用这些功能,您可以编写:

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()功能有时会有用(白名单而不是黑名单)。

Jonathan Leffler answered 2020-06-27T00:44:31Z
31 votes

等效的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字符串,即。 空终止的char数组。

RichieHindle answered 2020-06-27T00:42:51Z
25 votes

假设您的输入是一个标准的以N结尾的C字符串,那么您要使用memchr

#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
}
DaveR answered 2020-06-27T00:44:55Z
5 votes

处理C字符串时使用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://呜呜呜.昌平路塞浦路斯.com/reference/从library/CString/么么承认/]

[HTTP://呜呜呜.昌平路塞浦路斯.com/reference/从library/CString/str插入/]

Tom answered 2020-06-27T00:45:33Z
4 votes

你要

strchr(const char * s,int c)

如果字符c在字符串s中,它将返回一个指向s中位置的指针。 否则返回NULL。 因此,只需使用无效字符列表作为字符串即可。

Keith Smith answered 2020-06-27T00:46:02Z
2 votes

strchr从头开始搜索字符(从末尾开始strrchr):

  char str[] = "This is a sample string";

  if (strchr(str, 'h') != NULL) {
      /* h is in str */
  }
dfa answered 2020-06-27T00:46:22Z
1 votes

我相信最初的问题是:

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

并不是:

属于以null终止的字符串

如果确实如此,那么strchr确实是最合适的答案。 但是,如果字符数组没有空终止,或者字符位于列表结构中,那么您将需要创建一个以空字符终止的字符串并使用strchr或手动遍历集合中的元素,检查 每个依次。 如果集合很小,则线性搜索会很好。 大型集合可能需要更合适的结构来提高搜索时间-例如排序数组或平衡的二叉树。

选择最适合您的情况。

Skizz answered 2020-06-27T00:47:05Z
translate from https://stackoverflow.com:/questions/1071542/in-c-check-if-a-char-exists-in-a-char-array