2014-09-20 23 views
2

简言之我的代码,字符输入( “%d”,&值)

#include <stdio.h> 
int main() 
{ 
    int n; 
    scanf("%d", &n); 
    while(n != 0) 
    { 
     scanf("%d", &n); 
     printf("%d\n", n); 
    } 
    return 0; 
} 

它是为integer输入写入。但是如果我输入character(尽管n被删除为integer),则循环变为无限并打印最后一个输入值integer。如果我首先输入一个character,它似乎会打印一个内存地址。我的问题是,如果我输入character而不是integer,这里发生了什么?

+0

@ ricky2527摆脱无限循环的,为什么你认为?它有一个突破的条件。 – 2014-09-20 06:14:13

+0

当字符被输入时,程序似乎会自行终止,你确定代码是正确的吗? – 2014-09-20 06:26:27

+0

@darknight是的,我确定。尝试在终端的'gcc'编译器中运行它。 – 2014-09-20 06:29:06

回答

2

实际上,当其他字符被插入时,它不会被当作输入,它存在于输入缓冲区中,它不能被控制字符串读取。

控制字符串%d用于读取整数的字符,直到其他字符。

插入另一个字符时,由于无法读取,循环连续运行并打印变量的存在值。

0

scanf("%d", &n);装置只得到从stdin数目的数据,例如1,2。

因此,如果在第二输入键入char,例如“A”,“B”,在输入字符没有被存储在&nn仍然有第一个输入号码数据。

因此,无限循环来了。

+0

如果没有存储字符,则输入缓冲区应该包含零,这意味着while循环根本不被执行。 – 2014-09-20 06:30:09

2

当scanf失败时,它不会从输入缓冲区中删除字符(它会在成功时从缓冲区中删除数据)。因此,下一次在循环中触发scanf时,它不会等待用户输入(因为它的缓冲区中有未读字符)。但它再次失败,并再次失败(因为每次失败),因此将进入无限循环。

我坚信第一个scanf包含%c作为格式说明符。
您可以通过

if(scanf("%d",&n)==0) break;