【问题标题】:Clarification needed regarding getchar() and newline需要澄清 getchar() 和换行符
【发布时间】:2012-09-22 13:11:32
【问题描述】:

我对使用getchar() 读取用户输入的字符有疑问。

char char1, char2;
char1 = getchar();
char2 = getchar();

我需要从用户那里得到2 字符作为输入。在这种情况下,如果用户输入字符'A',后跟newline,然后输入字符'B',那么char2 中将存储什么 - 是换行符还是字符'B'

我在 Windows 上的 CodeBlocks 上尝试过,char2 实际上存储换行符,但我打算存储字符 'B'

我只想知道预期的行为是什么,以及它是否依赖于编译器?如果是这样,turbo C和mingW之间有什么区别?

【问题讨论】:

    标签: c++ c getchar


    【解决方案1】:

    是的,您必须在每次输入后使用换行符:

    char1 = getchar();
    getchar(); // To consume `\n`
    char2 = getchar();
    getchar(); // To consume `\n`
    

    这与编译器无关。这适用于所有平台,因为每个输入行的末尾都会有回车(尽管实际的换行可能因平台而异)。

    【讨论】:

    • 一个小问题:getchar() 是否会简单地刷新数据,占用任何空间来保存 LF?
    • @hikaru89 getchar() 调用只返回。如果它没有保存在程序中(如这里的第 2 和第 4 调用),它会被丢弃并且不涉及任何额外的存储。
    【解决方案2】:

    我只想知道预期的行为是什么,以及它是否依赖于编译器?

    这是预期的行为,与编译器无关。

    您可以使用scanf 读取 A 后跟换行符,然后 B 后跟换行符。如果你想坚持getchar(),那么只需输入AB

    【讨论】:

      【解决方案3】:

      您可以通过显式测试来防止读取换行符。 而不是简单地使用

      getchar():
      

      你可以使用这样的东西

      while((char1 = getchar()) == '\n');
      

      如果您在 Windows 上,您可能还想测试 '\r'。所以代码稍作改动。

      while((char1 = getchar()) == '\n' || char1 == '\r');
      

      【讨论】:

        【解决方案4】:

        在语句之间添加语句fflush(stdin);。 看看这个

        ch1=getchar();
        
        fflush(stdin);
        ch2=getchar();
        

        【讨论】:

        • 输入流上的 fflush() 是根据 C 标准未定义的行为。它可以在 Windows 上运行,至少在 Visual Studio 中是这样,但可能应该避免,因为它是非标准的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 2012-07-18
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多