我正在尝试制作一个非常基本的程序来比较两个数字。在输入2个数字之后,询问用户是否想要比较这2个数字。如果y/n表示是或否,我遇到的问题是程序似乎没有要求我输入,而是立即转到下一个打印语句。这是代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void){
int n1;
int n2;
char ch;
printf("compare 2 numbers, input a numbern");
scanf("%d", &n1);
printf("your first number is %dn", n1);
printf("enter your second number to compare n");
scanf("%d", &n2);
printf("your second number is %dn", n2);
printf("do you want to compare these numbers? y/n n");
//here is the problem. after entering y, the program closes.
//at this point I just want it to print the letter it was given by the user.
scanf("%c", &ch);
//the print statement that is supposed to print the letter the user inputs
printf("%c is a vowel.n", ch);
getch();
return 0;
}
//我使用这个代码作为正确运行的参考
#include <stdio.h>
int main()
{
char ch;
printf("Enter a charactern");
scanf("%c", &ch);
if (ch == 'a' || ch == 'A' || ch == 'e' || ch == 'E' || ch == 'i' || ch == 'I'
|| ch =='o' || ch=='O' || ch == 'u' || ch == 'U')
printf("%c is a vowel.n", ch);
else
printf("%c is not a vowel.n", ch);
return 0;
}
进行时
printf("enter your second number to compare n");
scanf("%d", &n2);
您将输入第二个数字,然后按ENTER
。这个ENTER (n)
仍然存在于缓冲器中。scanf
函数会自动删除空白。当您使用%c
时,scanf()
会在缓冲区中保留新行字符(%c
是例外,它们不会删除whitespace
)。
scanf("%c", &ch);
而不是使用
scanf("n%c", &ch);
当您使用%c、空格和"转义符"作为有效字符时。因此,它将存储在ch中。在前两个scanf中,您使用%d不会出错。
在第二个程序中,您调用scanf("%c",&ch);首先。这个问题没有出现。如果你再打电话,也会出现同样的问题。
出现此问题的原因是在按下Enter后,上一个scanf
剩余的换行符n
。这个CCD_ 11是留给CCD_ 12的下一个调用的
为了避免这个问题,您需要在scanf
中的%c
说明符之前放置一个空格。
scanf(" %c", &C);
...
scanf(" %c", &B);
...
scanf(" %c", &X);
%c
之前的空格可以占用任意数量的换行符。
或
您可以使用scanf吃掉单个字符,而无需将其分配给以下内容::
scanf( "%[^n]%*c", &C ) ;
%[^n]
告诉scanf读取每个不是'n'
的字符。这将在输入缓冲区中留下'n'
字符,然后* (assignment suppression)
将使用单个字符('n')
,但不会将其分配给任何内容。