首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >In C-检查字符数组中是否存在字符

In C-检查字符数组中是否存在字符
EN

Stack Overflow用户
提问于 2009-07-01 21:47:02
回答 7查看 167.9K关注 0票数 51

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

来自Python背景的我过去常常可以说:

代码语言:javascript
运行
复制
for c in string:
    if c in invalid_characters:
        #do stuff, etc

我如何使用常规的C字符数组来做到这一点?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-07-01 21:50:41

等效的C代码如下所示:

代码语言:javascript
运行
复制
#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数组。

票数 33
EN

Stack Overflow用户

发布于 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的字符,则返回一个空指针。

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

使用这些函数,您可以编写:

代码语言:javascript
运行
复制
size_t len = strlen(test);
size_t spn = strcspn(test, "invald");

if (spn != len) { ...there's a problem... }

或者:

代码语言:javascript
运行
复制
if (strpbrk(test, "invald") != 0) { ...there's a problem... }

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

票数 49
EN

Stack Overflow用户

发布于 2009-07-01 21:50:26

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

代码语言:javascript
运行
复制
#include <string.h>

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

另一方面,如果您的数组不是以null结尾的(即仅原始数据),则需要使用memchr并提供一个大小:

代码语言:javascript
运行
复制
#include <string.h>

char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0'
if (memchr(foo, 'a', sizeof(foo)))
{
  // do stuff
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1071542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档