【问题标题】:Print statement with for loop and if statement带有 for 循环和 if 语句的打印语句
【发布时间】:2019-05-23 14:35:11
【问题描述】:

我需要确定用户输入是否为数字。我需要遍历每个字符并检查是否都是数字,如果不是 printf() 错误消息,否则成功。我使用 for 循环遍历每个字符,并使用带有 isdigit() 函数的 if 语句来检查数字。但我的问题是我正在为每个字符打印。例如,如果我输入22A,我会收到22 的2 条成功消息,然后我会收到A 的错误消息。但我只需要打印错误消息,因为22A 不完全是数字。

    int n = strlen(argv[1]);
    for (int i=0; i<n; i++){
        if (isdigit((int)argv[1][i]) == 0){
            printf("Error\n");
            return 1;
        }
        else{
            printf("Success\n");
            printf("%i\n", atoi(argv[1]));   
        }
    }

【问题讨论】:

  • 您在循环中打印“成功”,所以它仍然只是部分成功。
  • @bruno: (a) atol 不会确定字符串是否为数字。它接受一个初始数字部分并且不提供是否是整个字符串的指示。 (b) 即使这样做了,它也不能满足规定的要求:“我需要遍历每个……”目标不仅仅是将字符串转换为数字,而是执行一个练习,可能是在一个类中OP是学生。调用库例程无法教授如何使用所教授的控制结构。
  • @EricPostpischil 我想说strtol,我不是第一次犯这个该死的错误
  • 在检查完字符串中的所有个字符之前,您不想打印“Success”,这意味着您希望在之后 i> 循环结束。
  • 当您说 numeric 时,您是否将其限制为仅数字,或者您是否允许使用前缀 -、小数分隔符,甚至可能是千位分隔符?然后还有科学记数法需要担心。请澄清一下,然后就可以回答了。

标签: c string for-loop


【解决方案1】:

如果您可以使用其他方式,您可以使用来自string.hstrspn()

size_t n = strlen(argv[1]);
if(strspn(argv[1], "0123456789")==n)
{
    printf("Success\n");
}
else
{
    printf("Error\n");
}

strspn() 返回仅由字节 f 组成的第一个参数字符串的初始段中的字节数 rom 第二个参数字符串,在这种情况下是数字。

所以,如果strspn()返回的值与字符串的长度相同,则字符串中没有非数字字符。


strlen() 不完全返回 int。这是一个size_t。最好改用后者。见strlen to return size_t?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2017-07-31
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多