C语言问题 用int 定义变量,输入的值能为字符吗?

#include<stdio.h>voidcritic(int*u);intmain(void){intunits;printf("Howmanypoundstoafir... #include <stdio.h>

void critic(int * u);

int main(void)
{
int units;
printf("How many pounds to a firkin of butter?\n");
scanf("%d", &units);
while ( units != 56)
critic(&units);
printf("You must have looked it up!\n");
return 0;
}

void critic(int * u)
{
printf("No luck, chummy. Try again.\n");
scanf("%d", u);
}

要求输入数字,当输入的值为56时停止,可是如果输入的为字母就无限循环而不是让你重新输入,这是为什么呢?
展开
 我来答
kaixingui2012
推荐于2017-09-21 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6443万
展开全部

C语言中, 用int 定义变量,采用scanf("%d")函数进行数据输入时,如果按下了非数字键,则scanf()函数会返回错误。

scanf()函数说明:

SYNOPSIS
    #include <stdio.h>
    int scanf(const char *format, ...);
RETURN VALUE
    The function return the number of input items successfully matched and assigned, which can be fewer than provided for, or even  zero  in  the event of an early matching failure.本函数返回成功匹配并赋值的输入项个数,有可能少于参数个数,当第一项匹配就不成功时,会直接返回0

如:

#include <stdio.h>
int main()
{
    int x,y,z;
    z=scanf("%d %d", &x,&y );
    printf("z=%d\n", z);
    return 0;
}
运行结果:
input : a
z=0

input : 1 a
z=1

input : 1 2
z=2

PS:如果scanf("%d")语句在循环语句中,当错按了字符后,scanf()返回出错,准备继续读一个正确的数时,因为,字符在缓存中没有清理,所以,一直会读出错,造成死循环。因此,最好是在scanf("%d")之后加一个getchar()命令,去吸收这个错误的字符,避免死循环。(正常的读入整数,一定也会以空格或回车来结束整数的输入,所以,getchar()在这里不会影响到程序的正常运行)

benben239
推荐于2017-09-11 · TA获得超过864个赞
知道小有建树答主
回答量:612
采纳率:100%
帮助的人:494万
展开全部
因为你用%d格式读取,这种格式默认是int型数据
由于你输入一个数字,系统会按照这个格式从缓冲区中读取掉这个数据
但是如果你输入的字符,系统就会读取失败,这个字符还是留在缓冲区中
然后系统接着读,还是读取失败,这个字符永远留在缓冲区中,系统就永远的读不完
更多追问追答
追问
那要怎么改?新手求教
追答
你程序不是对的么,我只是针对你的问题做了一个解释
你的程序并没有错呀
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heartwuyulunbi
2015-10-13 · 超过35用户采纳过TA的回答
知道答主
回答量:92
采纳率:0%
帮助的人:55.7万
展开全部
不行,编译器肯定要报错,如果需要可以使用(float)强制转换int型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式