gpt4 book ai didi

c - 如何检查命令行参数的每个字符?凯撒 PSET2

转载 作者:行者123 更新时间:2023-11-30 16:17:22 27 4
gpt4 key购买 nike

我需要检查命令行参数中是否有非数字字符。例如: ./problem 20x 应该打印出“不是数字”,因为它包含一个 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”的输出应该是“不是数字”

最佳答案

这个问题不需要两个 for 循环。每个循环都会独立工作,区别在于停止条件。我将在本例中使用 for 循环,但使用 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.h 中的函数,将其用于几乎所有内容。以下是 strlen 函数的示例。

size_t my_strlen(const char* s) {
size_t len = 0;

while (*s++)
++len;

return len;
}

每次计算 while 条件时,s 指针都会增加并取消引用。 *s 的每个值都将是某个 ASCII 值,因此非零,直到找到 nul 终止符,此时 ++len 语句将不会被处决。这就是为什么 strlen 通常返回字符串的长度减去 nul 终止符

所以基本上,我在程序示例中使用的 for 循环取决于输入的字符串长度,间接取决于查找输入字符串的 nul 终止符。这就是为什么您也可以在检查 nul 终止符时使用 while 循环。

<小时/>

顺便说一句,我确实注意到你在成功和失败分支的末尾都返回了 1,这让我有点困惑。按照惯例,返回 1 表示错误,事实上 stdlib.hEXIT_FAILURE 宏定义为 1。我自己确实使用了这些宏,不过如果您注意到我定义了 TRUEFALSE 使用枚举,这使得它们在词法上对程序可见为“FALSE”和“TRUE”以及 0 和 1,这是它们各自的值,而不是只是由预处理器将文本替换为 0 和 1。

此外,您没有包含 header 或以前的定义,但我猜您使用的是 Windows,因为 false 在没有手动定义的情况下不是 C 中的有效值,而Visual Studio 作为一个 C++ 编译器,确实允许这样做。我提出这个问题是因为我对 string s = argv[1] 行感到困惑。这可能意味着您使用的是 C++ 编译器并使用了臭名昭著的 using namespace std;,或者您输入了: typedef const char* string。我个人不喜欢这两种选择,但各有各的选择。

无论如何,我希望这会有所帮助,祝你好运。

关于c - 如何检查命令行参数的每个字符?凯撒 PSET2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56265161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com