使用scanf检查存储的变量

时间:2014-01-18 06:29:53

标签: c char int scanf unsigned

我想知道为什么无论我输入一个数字,一个字母还是一个字符,它都会不断打印最后一条打印线,那么为什么“这是一个整数线永远不会工作?我怎么去获取用户只输入正数?

  #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");

  }
}

5 个答案:

答案 0 :(得分:3)

else if ( num >= '0' && num <= '9')更改为else if ( num >= 0 && num <= 9),假设您输入0到9之间的数字。

答案 1 :(得分:1)

你不是在第二次比较int。 根据您的需要,将其更改为(即删除'')

(num> = 0)

否则if(num&gt; = 0&amp;&amp; num&lt; = 9)

答案 2 :(得分:0)

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

的手册页

你需要scanf("%c", &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");
}

是一个解决方案

答案 3 :(得分:0)

您需要正确获取变量的类型。 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仍然需要了解更多基本内容。

答案 4 :(得分:0)

&#39; 0&#39;的ASCII是48.和&#39; 9&#39;是48 + 9。 因此,如果您输入介于48和57之间的值,则else if ( num >= '0' && num <= '9')将为真。

正如jfly所说,解决方案是改为else if ( num >= 0 && num <= 9).