c - printf 在 getchar 之后完成,但放在之前

标签 c eclipse

<分区>

好的,所以我正在尝试制作一个“读取字符”函数,它只接受大写或小写字母,而不是重音符号(我是法语,所以这对法语键盘很重要)并返回大写字母。 为此,我为 readcharacter 函数制作了另一个源文件:

char readCharacter()
{
    char character;

    do
    {
        printf("Please enter a letter without accents and hit 'enter': ");

        character = getchar();
        while(getchar() != '\n');

        printf("\n");

        character = toupper(character); //Upper-case if lower case
    } while(((character < 65)||(character > 90)));
    return character;
}

这是我的主要内容:

#include "main.h"
int main(void)
{
    char MyLetter = readCharacter();
    char MyLetter2 = readCharacter();
    printf("%c\n%c\n", MyLetter, MyLetter2);
}

我的问题是,我的输出是这样的:

S
l
Please enter a letter without accents and hit 'enter': 
Please enter a letter without accents and hit 'enter':
S
L

为什么我不明白?

Please enter a letter without accents and hit 'enter':S 
Please enter a letter without accents and hit 'enter':l
S
L

不知道这是否相关,但我的 IDE 是 eclipse,编译器是 MinGW(gcc?) 抱歉英语不好和/或编码不好...我刚开始编码... 谢谢!

最佳答案

问题是 stdout(由 printf 使用)的输出在默认情况下是 line buffered。这意味着只有在有换行符、缓冲区已满或您显式刷新它时才会写入缓冲输出。

由于您的函数中没有发生任何事情,因此输出只是“延迟”,直到它被您在 main 函数中打印的换行符刷新。

有两种解决方法:

  1. 要么在readCharacter 函数中打印的字符串末尾添加一个换行符;
  2. 或调用 fflush(stdout) 以在 printf 调用后刷新缓冲区。

关于c - printf 在 getchar 之后完成,但放在之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45977597/

相关文章:

c - 将字符串与指针数组分开

java - 名字的第一个字符,姓氏的第一个字符,然后是名字的第二个字符

c - 从 c 中的管道读取并打印到标准输出

eclipse - java.lang.IllegalArgumentException : already added: Lorg/hamcrest/BaseDescription; Conversion to Dalvik format failed with error 1

android - 如何避免 LinearAlloc 超出容量错误 android

c - 决定尝试一下 C 中的自制函数

c - 在线判断问题(错误答案)

Android ==> Eclipse Heap 工具问题?

eclipse - Maven Checkstyle 和 Eclipse Checkstyle 使用相同的配置文件报告相似但不同的结果

java - 如何在 SourceViewer 中显示查找替换对话框(快捷键 Ctrl+F)