在C中获取和打印字符?

时间:2009-09-10 16:15:52

标签: c

如何从用户处获取并打印字符? 这要做吧......

#include <stdio.h> 
int main() {

    float number1;
    char mychar = ' ';

    printf("Number?\n");
    scanf("%f", &number1);

    printf("Character?\n");
    scanf("%c", &mychar);

    printf("You typed number: %f\n", number1);
    printf("You typed the char: %c\n", mychar);
}

4 个答案:

答案 0 :(得分:3)

你看到的问题是它真的在读一个角色,但它不是你期待的角色。 scanf格式化输入。你第一次打电话给它时,你会告诉它期待一个号码。但你真的输入的不仅仅是一个数字:

Number?
1234.5678<enter>

当您按下回车键时,它实际上是在输入流中插入一个字符。您可能知道,我们使用\ n来表示换行符,即按Enter键时获得的字符。因此,您的输入流实际上看起来像“1234.5678 \ n”。

所以scanf做了它的事情并读取1234.5678然后它看到'\ n'。它说:“哦,这不是数字的一部分,所以我会停下来。”好吧,你的输入仍然是'\ n'。下次调用scanf时,告诉它读取一个字符。用户键入他们想要的任何内容,但是它位于前一个scanf的'\ n'后面。所以scanf尝试将输入流与一个字符进行匹配,然后说“好吧,这个输入流中的第一个东西是一个字符,而且它是'\ n',所以我会返回它。”用户键入的内容仍然位于输入流中。

因此,摆脱它的一个简单方法是使用一个循环来清空输入流中的所有剩余字符,直到找到'\ n'。

printf("Number?\n");
scanf("%f", &number1);
while( getchar() != '\n');

执行此循环后,您的输入流将为空。因此,下次调用scanf时,它会等待用户键入内容并使用用户键入的内容。

另请注意,scanf有一个返回值,您应该在调用后检查它。阅读有关scanf的信息,了解它返回的内容。

答案 1 :(得分:2)

如评论所述,您的问题已包含答案。但无论如何:

如果你想在c ++中做同样的事情,你可以使用流:

int mynumber;
char mychar;
cout << "Number?" << endl;
cin >> mynumber;
cout << "Character?" << endl;
cin >> mychar;
cout << "you typed number " << mynumber << " and char " << mychar << endl;

当然,你的C实现在C ++中也可以正常工作。

(如果您正在开发更严肃的应用程序,我建议使用比cin或scanf更复杂的东西)

答案 2 :(得分:2)

在C中,您不需要使用scanf来获取单个字符。您可以使用getchar()函数:

printf("Would you like a donut? [Y/N] ");
answer = getchar();

switch(answer) {
    case 'y':
    case 'Y':
        printf("Mmmm... donuts!");
        break;
    case 'n':
    case 'N':
        printf("Eugh... donuts?");
        break;
    default:
        printf("You should never ignore code offering donuts.");
        break;
}  

答案 3 :(得分:-1)

查找gets(),getc()等 -