c-输入一个字母,存储在一个变量中,将字母打印到命令行



我正在尝试制作一个非常基本的程序来比较两个数字。在输入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'),但不会将其分配给任何内容。

相关内容

  • 没有找到相关文章

最新更新