2012-08-10 44 views
-3
#include <stdio.h> 

int main(){ 
    int l,m,q,j; 
    char option; 
    scanf("%d",&q); 
    printf("%d\n",q); 
    for(j=0;j<q;j++){ 
     scanf("%c %d %d",&option,&l,&m); 
     printf("%c %d %d",option,l,m); 
    } 
    return 0; 
} 

输出:输出错误的下面的C代码

3(Input) 
3 
C 1 4(Input) 

0 -374066224C 1 4 

什么是错的,上面的代码?它没有给出预期的输出。

+0

你是什么*预期*输出? – Levon 2012-08-10 13:17:09

+0

**是预期产出?你尝试调试它吗?似乎谎言与家庭作业有关的问题... – 2012-08-10 13:17:13

+0

@Levon它不是一个家庭作业,我尝试使用GDB调试,但没有用。预期的输出应该与输入 – 2012-08-10 13:19:23

回答

9

还有输入流中的换行字符从初始scanf()(以及后续scanf() S):这将被分配到optionC不是int,意味着lm是随后int分配将失败未初始化int变量。

要跳过它for环内的前导空格字符添加到scanf()的格式说明:

scanf(" %c %d %d",&option,&l,&m); 
    /*^*/ 

scanf()返回值是由成功的任务数量:检查,以确保3分配制成。

if (3 == scanf(" %c %d %d",&option,&l,&m)) 
{ 
    /* Valid input. */ 
} 
+0

相同,这解决了这个问题,但你能解释为什么有一个换行符请 – 2012-08-10 13:27:03

+0

@sachinirukula,当用户输入他们输入'3'的数字并返回。返回在输入流中插入一个新的行字符。新行字符不会被'scanf()'消耗,而是留在输入流中。 – hmjd 2012-08-10 13:28:40

+0

@sachinirukula之所以回到古老的打字机之类的东西。当您按下等价物进入时,机器执行回车(回到纸张的最左侧),然后更改为新的行。 Windows的工作原理相同。 Windows文本文件甚至以ASCII符号'\ r'(ASCII 13)'\ n'(ASCII 10)结尾每行,它们分别被称为回车符和换行符。 – Lundin 2012-08-10 13:33:14

2

每次提示用户输入时,他们都会输入,然后按回车。 Enter在输入缓冲区中留下一个换行符。在请求字符输入之前,您必须放弃它,否则它将最终放入字符变量中。

的容易,但生硬的解决方案是这样的:

scanf("%d",&q); getchar(); 
printf("%d\n",q); 
for(j=0;j<q;j++){ 
    scanf("%c %d %d",&option,&l,&m); getchar(); 
    printf("%c %d %d",option,l,m); 
} 

(我敢肯定有这个地方是C常见问题,但我不能找到链接)

+0

hmjd的解决方案更加漂亮,所以我愿意这样做。 – Lundin 2012-08-10 13:29:11