首页 > 解决方案 > 循环遍历字符串以查找不需要的字符

问题描述

我正在编写一个程序,它只接收一个由 o、c 和 g 组成的字符串。我想做一个 if 语句,说明字符串是否由这 3 个字符以外的任何字符组成,打印错误消息或其他内容。这是我到目前为止所拥有的。

void printFunction(char *str);

int main(int argc, char **argv)
{
  char *input;

  input = argv[1];
  if (argc == 2 && strspn(input, "ogc") != 0) //problem
  {
    printFunction(input); //separate function

  }
  else
  {
    printf("Uhhh ENter the correct input dufus");
  }

  return 0;
}

如果所有 3 个字符都不存在,但如果字符串包含三个字符之一,则此方法有效,它会打印字符串。不知道如何解决这个问题。

标签: cstring

解决方案


您快到了。由于strspn()为您提供了仅包含某些字符的初始子字符串的长度,因此判断字符串是否包含这些字符的方法是结果是否为完整字符串长度:

if (argc >= 2 && strspn(input, "ogc") == strlen(input))

以下程序在操作(a)中显示了这一点:

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

int main (int argc, char *argv[]) {
    for (int i = 1; i < argc; ++i) {
        printf("%s '%s'\n",
            strspn(argv[i], "cog") == strlen(argv[i]) ? "YES:" : "NO: ",
            argv[i]);
    }
    return 0;
}

根据以下成绩单:

pax:~> ./testprog cog x o g cougar 'cogito ergo sum' ccc ooo ggg gocog ""
YES: 'cog'
NO:  'x'
YES: 'o'
YES: 'g'
NO:  'cougar'
NO:  'cogito ergo sum'
YES: 'ccc'
YES: 'ooo'
YES: 'ggg'
YES: 'gocog'
YES: ''

请注意最后一个,它基于您应该只拒绝包含其他字符的字符串的规则。相反,如果规则是它应该包含该集合中的字符而不是其他字符,那么检查长度是否非零是一件简单的事情。


(a)正如chux评论中提到的,还有另一种方法可以做到这一点而不必调用strlen,对于大字符串或需要每秒执行很多次的方法可能是值得的。

由于可以返回的最大值strspn是字符串的长度,因此您只需检查该索引处的字符以确保它是字符串终止符。如果是,则字符串仅由所需字符组成。如果不是,则该位置的字符将是字符串中第一个无效的字符。

这可能是一个简单的指针/索引添加和取消引用,而不是扫描整个字符串以获得长度。表达式为:

argv[i][strspn(argv[i], "cog")] == '\0'

推荐阅读