我正在尝试制作一个非常基本的程序来比较2个数字。在输入2个数字后,询问用户是否要比较2个数字。如果y / n表示是或否。我遇到的问题是程序似乎没有要求我输入并立即转到下一个print语句。这是代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void){
int n1;
int n2;
char ch;
printf("compare 2 numbers, input a number\n");
scanf("%d", &n1);
printf("your first number is %d\n", n1);
printf("enter your second number to compare \n");
scanf("%d", &n2);
printf("your second number is %d\n", 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 character\n");
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;
}
答案 0 :(得分:1)
当你这样做时
printf("enter your second number to compare \n");
scanf("%d", &n2);
您将输入第二个数字,然后按ENTER
。这个ENTER (\n)
仍在缓冲区中。
scanf
函数自动删除空格。当您使用scanf()
时,%c
会将新行char保留在缓冲区中(%c
是他们不会删除whitespace
的例外情况。)
scanf("%c", &ch);
而不是这个用途
scanf("\n%c", &ch);
答案 1 :(得分:0)
当你使用%c,空格和“转义字符”作为有效字符时。它将存储在ch中。在前两个scanf中,你使用%d就可以没有错。
在第二个程序中,您调用scanf(“%c”,&amp; ch);在第一个。这个问题不会出现。如果你再次打电话,也会出现同样的问题。
答案 2 :(得分:0)
在按 Enter 之后,此问题的原因是前一个\n
的新行字符scanf
。此\n
留待scanf
的下一次调用
要避免此问题,您需要在%c
中的scanf
说明符之前放置一个空格。
scanf(" %c", &C);
...
scanf(" %c", &B);
...
scanf(" %c", &X);
%c
之前的空格可以占用任意数量的换行符。
OR
您可以使用scanf来吃单个字符而不将其分配给此类::
scanf( "%[^\n]%*c", &C ) ;
%[^\n]
告诉scanf读取每个不是'\n'
的字符。这会在输入缓冲区中留下'\n'
字符,然后* (assignment suppression)
将使用单个字符('\n')
,但不会将其分配给任何内容。