我需要检查命令行参数中是否有非数字字符。例如:./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”的输出应为“非数字”
答案 0 :(得分:0)
对于此问题,您不需要两个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.h
将EXIT_FAILURE
宏定义为1。我确实使用了这些宏,尽管如果您注意到我定义了TRUE
和FALSE
使用一个枚举,这使得它们在程序上都按词法显示为“ FALSE”和“ TRUE”以及分别为0和1的值,而不是由预处理器简单地将其文本替换为0和1。 / p>
此外,您没有包含标头或以前的定义,但是我猜您在Windows上,因为false
在C中未经手动定义就不是有效值,而Visual Studio作为C ++编译器,确实允许这样做。之所以提出这一点,是因为我对行string s = argv[1]
感到困惑。这可能意味着您正在使用C ++编译器并使用了臭名昭著的using namespace std;
,或者键入了typedef const char* string
。我个人不喜欢任何一种选择,但每个人都有自己的选择。
无论如何,我希望这会有所帮助,祝你好运。