我想知道为什么无论我输入一个数字,一个字母还是一个字符,它都会不断打印最后一条打印线,那么为什么“这是一个整数线永远不会工作?我怎么去获取用户只输入正数?
#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");
}
}
答案 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).