我需要检查命令行参数中是否有非数字字符。例如:./problem 20x应该打印出"Not a digit“,因为它包含一个x。我的代码似乎没有遍历命令行参数中的所有字符。
我基本上尝试了不同类型的循环,但似乎不起作用。
string s = argv[1];
for (int i = 0, n = strlen(s); i < n; i++)
{
while (s[i] != '\0')
{
if (isdigit (s[i]) == false)
{
printf(" Not a digit\n");
return 1;
}
}
int k = atoi(s);
printf("Success\n");
return 1;
}
}
我希望"20x“的输出会打印出”一个数字都不是“。另外,"x20“的输出应该是”非数字“。
发布于 2019-05-23 11:08:21
这个问题不需要两个for循环。这两个循环都会自己工作,不同之处在于停止条件。在本例中,我将使用nul循环,但使用while
循环的类似实现将简单地检查下一个字符是否为nul终止符。
enum bool_t {
FALSE,
TRUE
};
int main(int argc, char *argv[])
{
if (argc == 1) {
fprintf(stderr, "No input(s).\n");
return EXIT_FAILURE;
}
while (*++argv) {
int found_invalid_character = FALSE;
for (size_t i = 0; i < strlen(*argv); ++i) {
if (!isdigit((*argv)[i])) {
found_invalid_character = TRUE;
break;
}
}
if (found_invalid_character) {
printf("%s is not a valid integer.\n", *argv);
continue;
}
int n = atoi(*argv);
printf("%d is a valid integer.\n", n);
}
return EXIT_SUCCESS;
}
输出:
x20 is not a valid integer.
20x is not a valid integer.
20 is a valid integer.
请记住,argv
是一个指向以null结尾的字符数组的指针数组,因此您总是可以通过检查是否命中nul结束符来迭代"string“。如果您愿意的话,您可以在string.h
中重新实现这些函数,将其用于几乎所有的事情。下面是strlen
函数的例子。
size_t my_strlen(const char* s) {
size_t len = 0;
while (*s++)
++len;
return len;
}
每次评估while
条件时,都会增加和取消对s
指针的引用。在找到nul终止符之前,*s
的每个值都将是某个ASCII值,因此是非零的,此时将不会执行++len
语句。这就是为什么strlen
通常返回字符串的长度减去nul结束符的原因。
因此,基本上,我在示例中为程序使用的for
循环依赖于输入字符串的长度,间接依赖于找到输入字符串的nul结束符。这就是为什么你可以在检查nul终止符时使用while
循环的原因。
顺便说一句,我确实注意到在成功分支和失败分支的末尾都返回了1,这让我有点迷惑。返回1通常表示错误,实际上stdlib.h
将EXIT_FAILURE
宏定义为1。我自己也使用这些宏,但如果您注意到我使用枚举定义了TRUE
和FALSE
,这使它们在词法上对程序可见为"FALSE“和"TRUE”以及0和1,这是它们各自的值,而不是被预处理器简单地文本替换为0和1。
此外,您没有包含头文件或以前的定义,但我猜您是在Windows上,因为如果不手动定义,false
在C中不是有效值,而作为C++编译器的Visual Studio则允许这样做。我提出这个问题是因为我被string s = argv[1]
这一行搞糊涂了。这可能意味着您使用的是C++编译器并使用了臭名昭著的using namespace std;
,或者您输入了using namespace std;
:typedef const char* string
。我个人不喜欢这两种选择,但各有各的选择。
不管怎样,我希望这对你有帮助,祝你好运。
https://stackoverflow.com/questions/56265161
复制相似问题