2013-02-18 91 views
-1

执行以下代码时遇到困难。完成一次执行后,变量't'取空值。该问题已通过使用getch()而不是scanf()来解决。但我不知道为什么会发生。任何解释? 这是没有用的程序。getch()和scanf()函数之间的区别

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
char t; 
void main() 
{ 
    while(1) 
    { 
     scanf("%c",&t); 
     printf("\nValue of t = %c",t); 
     printf("\nContinue (Y/N):"); 
     char a=getche(); 
     if(a=='n' || a=='N') 
     exit(0); 
    } 
} 

现在,这是正确执行的程序。

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
char t; 
void main() 
{ 
    while(1) 
    { 
     t=getch(); 
     printf("\nValue of t = %c",t); 
     printf("\nContinue (Y/N):"); 
     char a=getche(); 
     if(a=='n' || a=='N') 
     exit(0); 
    } 
} 
+0

[奇怪的循环可能重复使用%c](http://stackoverflow.com/questions/13814128/odd-loop-does-not-work-using-c) – 2013-02-18 19:03:40

+0

'void main()'不是托管实现的合法*签名*(除非它们具有扩展名) – pmg 2013-02-18 19:30:12

回答

8

当你读一个字,

scanf("%c",&t); 

有一个换行符这将导致后续的scanf()跳过循环输入的输入流中留下的。

请注意,getch()是非标准功能。您可以改用getchar()

或更改为:读取字符%c之前

scanf(" %c",&t); 

注意在格式说明符的空间,确保所有空格都被跳过的scanf()。

+0

我已经一遍又一遍地阅读了同样的问题。为什么每次我读他们的时候,我的手掌仍然盯着我的额头。尽管这次我会记住它! – Nocturno 2013-02-18 19:45:02

+0

谢谢@KingsIndian,如果你在使用%s而不是%c执行时可以向我解释同一个程序,那将是非常友善的。 – devKeshav 2013-02-19 14:04:30

+0

@KeshavAgarwal即使你阅读一个字符串(使用'%s'),换行符仍然存在于输入流中。只有当您尝试在*之后阅读某些内容时,您才可能遇到问题。例如,如果你这样做:'scanf(“%c”,&ch);''在读完一个字符串后,你会看到同样的问题,因为换行符不会读'ch'的字符。读一个int:'scanf(“%d”,&i);'那么你不会看到这个问题,因为scanf期望%d的整数,所以它会跳过换行符。 – 2013-02-19 14:50:51

相关问题