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

时间:2013-12-04 05:38:37

标签: c visual-studio-2010 variables user-input windows-7-x64

我正在尝试制作一个非常基本的程序来比较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;
}

3 个答案:

答案 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'),但不会将其分配给任何内容。