【问题标题】:checking stored variable with scanf使用 scanf 检查存储的变量
【发布时间】:2014-02-07 16:03:48
【问题描述】:

我想知道为什么无论我输入一个数字、一个字母或一个字符,它都会继续打印最后一行,为什么是“这是一个整数行永远不起作用?我该如何获取用户只输入一个正数?

  #include <stdio.h>
  #include <limits.h>

  main(){
  unsigned int num;
  printf("Please input a positive number: ");

  scanf("%d",&num);
  if ((num >= 'a' && num <= 'z') || (num >='A' && num <= 'Z')){
    printf("not an interger(alpha)");
  }
  else if ( num >= '0' && num <= '9'){
    printf("yes this is an integer");
  }
  else{
    printf("not an integer");

  }
}

【问题讨论】:

  • 顺便说一下,main() 应该有一个 int 返回类型。
  • @jfly - 它是 C - 无效是可能的
  • @EdHeal 对于 C99,不能省略 int 返回类型。您可以省略 main 中的 return 语句。如果你这样做了,并且 main 完成了,就会有一个隐式返回 0。我认为应该避免它。

标签: c char int scanf unsigned


【解决方案1】:

else if ( num &gt;= '0' &amp;&amp; num &lt;= '9') 更改为else if ( num &gt;= 0 &amp;&amp; num &lt;= 9),假设您输入了一个介于 0 和 9 之间的数字。

【讨论】:

  • 尝试在该代码中输入 65。它会报错
  • 我知道这个问题,因为 char 在 C 中也是一个 int。我只是指出为什么 OP 不能得到他所期望的。
  • 根本问题是比较两个不同的东西
【解决方案2】:

您没有在第二个 if 中与 int 进行比较。 根据您的需要,将其更改为(即删除'')

(num >= 0)

else if ( num >= 0 && num

【讨论】:

    【解决方案3】:

    您需要正确设置变量的类型。 unsigned int 只能是:非负整数。您不能查看整数中的第一个字符。

    您的程序分析一个字符串,即一个字符数组,即使它只查看第一个字母。因此,您的数据必须是字符数组。这也意味着您需要使用"%s" 扫描字符串。

    当您测试字符串的第一个字符时,您必须使用数组索引str[0]

    把所有这些放在一起:

    #include <stdio.h>
    
    int main()
    {
        char str[20];
    
        printf("Please input a positive number: ");
        scanf("%19s", str);
    
        if ((str[0] >= 'a' && str[0] <= 'z') || (str[0] >='A' && str[0] <= 'Z')) {
            printf("alpha\n");
        } else if (str[0] >= '0' && str[0] <= '9') {
            printf("integer\n");
        } else {
            printf("other\n");
        }
    
        return 0;
    }
    

    编辑:正如所指出的,此代码不检查字符串是否表示十进制数。它只检查第一个字符。完整的解决方案应检查所有字符,并留给原始海报作为练习。

    我的印象是 OP 很难区分数据类型,所以我试图专注于此。

    我还在scanf 中添加了一个字段宽度以避免缓冲区溢出。 sscanf的细节我这里就不多说了,因为我觉得OP还是要了解更多很基础的东西。

    【讨论】:

    • 还是不太对。输入 '0hhhhh' 会说它是一个整数。如果您输入超过 19 个字符,请不要让我开始
    • @EdHeal:当然代码不是完整的检查输入是否代表小数。它基于 OP 的示例。如果我通过在一段一次性代码中省略字符串宽度来“让你盯着看”,你很容易生气,不是吗。难道你 - 和这里的其他海报,就此而言 - 看到 OP 在将字符串和整数的概念理解为不同的数据类型方面存在问题吗?我的回答旨在为 OP 指明正确的方向。
    • “别让我开始......”是英语委婉语
    • 显然我的母语不是英语,但我想我知道“不要让我开始”是什么意思。好吧,我以为我知道这意味着什么,也许我需要更加小心。没关系。
    • 只有英语才能正确说出来——或者我们被引导相信:->(PS:让美国人发音 Worcestershire)
    【解决方案4】:

    '0'的ASCII是48。'9'是48+9。 所以else if ( num &gt;= '0' &amp;&amp; num &lt;= '9') 会在你输入一个介于 48 和 57 之间的值时为真。

    解决办法,如jfly所说,改成else if ( num &gt;= 0 &amp;&amp; num &lt;= 9).

    【讨论】:

    • 那么你必须在 scanf("%d",&num); 中使用 %s 而不是 %d并且 num 应该是一个字符数组。
    • 此解决方案仅适用于 0 到 9 之间的数字,不适用于大于 9 的数字
    • 是的。因此,您必须将其扫描为字符串并使用一些简单的自定义函数来检查它是否为整数。您可以使用内置函数,例如 isdigit。
    【解决方案5】:

    此代码不正确。请查看scanf http://linux.die.net/man/3/scanf 的手册页

    你需要scanf("%c", &amp;character_var);并反复调用它。或者读取一个字符串

    编辑

    if (scanf("%u", &num) == 1) {
       printf("Well done - you managed to type in a positive integer %u\n", num);
    } else {
       printf("Have another go!\n");
    }
    

    是一个解决方案

    【讨论】:

    • 但变量是无符号整数,它意味着保存数字 0 和更大.. ?
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多