字符串中的字符与C中的一组字符的比较

字符串中的字符与C中的一组字符的比较,c,string,C,String,我一直在从事一个需要验证字符串中字符的项目 比如说,我的一组有效字符是'abcde',其中所有字符启动不同的函数 首先,代码要求用户输入。之后,将其与该集合进行比较,以检查是否存在任何无效输入(除abcde之外的任何字母)。在此之后,角色启动各自的功能 我理解,可以通过以下方式实现: for (i = 0; i <= sizeof(string) - 1; i++) { if (string[i] != 'a' || string[i] != 'b' || stri

我一直在从事一个需要验证字符串中字符的项目

比如说,我的一组有效字符是'abcde',其中所有字符启动不同的函数

首先,代码要求用户输入。之后,将其与该集合进行比较,以检查是否存在任何无效输入(除
abcde
之外的任何字母)。在此之后,角色启动各自的功能

我理解,可以通过以下方式实现:

    for (i = 0; i <= sizeof(string) - 1; i++) {
        if (string[i] != 'a' || string[i] != 'b' || string[i] != 'c' || 
            string[i] != 'd' || string[i] != 'e') {
            printf("Invalid Input");
        }
    }
for(i=0;iEDIT):由于有评论指出标准的
strspn()
函数已经从我的雷达上消失了,我们可以这样实现它:

const size_t num_valid = strspn(string, "abcde");
if(string[num_valid] != '\0')
  printf("Invalid input: '%s'\n", string + num_valid);
这很好,因为它将循环从用户代码中推出,从而降低了复杂性

起初,我声称这是[
strchr()
]的典型情况 (),我仍然认为:

for(size_t i = 0; string[i] != '\0'; ++i)
{
  if(strchr("abcde", string[i]) == NULL)
  {
    printf("Invalid input: '%c'\n", string[i]);
    break;
  }
}

你的方式是非常理想的,尽管你可以考虑使用<代码> StrCHR 。<强>不要< /强>通过写表面华丽的<>代码>(String [i] < A′字符串[i]>E)< /p> >,以牺牲可移植性。 我对

sizeof(string)-1有更多问题。如果
string
已衰减为指针,则
sizeof(string)
不会给出元素的数量。此外,
sizeof
返回一个
无符号
类型,
-1
可以将您推过零到最大
大小


改为使用预先计算的strlen

听起来您可以使用
strpbrk
函数,该函数完全满足您的需要:从字符列表中查找任何字符的第一个匹配项。例如:

#include <string.h>
#include <stdio.h>

int main()
{
  const char STR_VALID[] = "abcde";
  char data[] = "invalid code";

  for(char* ptr=strpbrk(data, STR_VALID); ptr!=NULL; ptr=strpbrk(ptr+1, STR_VALID))
  {
    putc(*ptr, stdout);
  }
}

对于您的用例,最简单的解决方案是对标准但很少使用的库函数的一次调用
strspn()

strspn()
如果
string
“abcde”中的一个字符匹配,则计算开始处的字符数
i
是与
a
b
c
d
e
中任何一个都不匹配的第一个字符的偏移量。如果它不是字符串的结尾,则输入无效

请注意,问题中的代码有一些问题:


  • 循环测试
    i
    if(string[i]<'a'| | string[i]>'e'){/*error*/}
    同样,你的意思是在if语句中使用
    &&
    而不是
    |
    吗?在有效字符的静态常量数组中搜索字符,例如“abcde”。for语句应该是
    size\t len=strlen=strlen(string);for(i=0;i
    因为
    sizeof
    会给你4或8个指针大小的判断。谢谢,愚蠢的错误。我没有索引就重写了它。我也会提供索引驱动的。我们有一个1次重复操作。指针版本会让他们大吃一惊。它不应该是
    strchr(“abcde”,*string)吗
    ?@MananVora这可能是因为
    string
    是本地作用域中的一个实际数组。我将再次写入。:)实际上有一个更简单的解决方案:这个问题是
    strspn()
    的一个典型用例。如果它是指针,它的大小会是什么?出于好奇问一下,大小会有多大变化?@turmuka:如果
    string
    是指针,那么
    sizeof(string)
    sizeof(char*)
    相同,它将是平台上的
    char*
    指针类型的大小。
    adcde
    
    size_t i = strspn(string, "abcde");
    if (string[i] != '\0') {
        printf("Invalid input: '%c'\n", string[i]);
    }
    
    for (i = 0; string[i] != '\0'; i++)