c - 循环遍历字符串以查找不需要的字符
问题描述
我正在编写一个程序,它只接收一个由 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 个字符都不存在,但如果字符串包含三个字符之一,则此方法有效,它会打印字符串。不知道如何解决这个问题。
解决方案
您快到了。由于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'
推荐阅读
- powershell - 使用 Powershell 扫描 .log 以查找最新行中的特定字符串
- java - Chrome Performance Metrics 上不同方法的不同结果?
- java - 迁移到 Java 9 或更高版本时是否需要切换到模块?
- rest - 从 Saleforce 调用 API 给出错误代码 500
- python - 为什么 Microsoft VS Code 会引发错误?如何确保没有打开许多窗口,但所有事情都在一个窗口中完成?
- javascript - nextTick 中的错误:ViewTree 中的“RangeError:超出最大调用堆栈大小”
- linux - update_rq_clock 和 update_rq_clock_task 的区别
- c++ - winsock2中的错误代码“5”是什么意思?
- protractor - 在量角器的 package.json 中使用脚本标签时找不到规范
- sql - 在 pyspark 中根据一些复杂的逻辑做一些列