【问题标题】:the 'getchar' function in cc中的'getchar'函数
【发布时间】:2023-03-28 16:17:01
【问题描述】:
#include <stdio.h>

int main() {
    int n = 6;
    while (n--){
        int c = getchar();
        printf("%c",c);
    }   
    return 0;
}

谁能解释一下上面的代码?就像我输入这样的内容

99999

我得到这样的输出

99999

但是我在给出了五个 9 后按了“Enter”,但是如何读取所有的 9?我的意思是如果我使用 scanf 我必须在每次输入后按 enter,但我没有在那里这样做,我将 getchar 的返回值分配给一个 int 变量,它不能将五个 int 一起存储,那么 getchar 函数如何一次阅读所有五个九?

【问题讨论】:

  • 因为 5 个 9 都存在于输入缓冲区中,并且在您按下 后可供程序读取。 scanf 也是如此 - 每个项目后不一定需要换行,只是为了终止序列。
  • 使用 putchar 也更简单。
  • 这能回答你的问题吗? How %c and %s works in C language?
  • getchar

标签: c char scanf newline getchar


【解决方案1】:

这实际上与 C 语言无关,而是与操作系统和输入输出子系统有关。

默认情况下,终端输出是面向行的,这意味着低级系统(驱动程序和/或系统例程)缓冲键盘上键入的内容,并且仅在一行完成时向程序提供数据(回车或回车)已给出换行符)。

在类 Unix 系统(Linux,...)中,您可以使用 stty raw 将终端设置为原始模式,以使您的 C 程序能够在键入一个字符后一次处理一个字符。但要注意它有令人讨厌的副作用,例如要求 Ctrl J 输入新行...

【讨论】:

    【解决方案2】:

    如果你要运行这个演示程序

    #include <stdio.h>
    
    int main( void ) 
    {
        size_t n = 6;
        
        while ( n-- )
        {
            int c = getchar();
            printf( "%c", c );
        }
        
        n = 6;
        
        while ( n-- )
        {
            char c;
            scanf( "%c", &c );
            printf( "%c", c );
        }
        
        
        return 0;
    }
    

    两次进入序列

    99999
    

    每次按下 Enter 键后,两个 while 循环都会得到相同的输出

    99999
    99999
    

    这是两个调用

    int c = getchar();
    

    scanf( "%c", &c );
    

    将依次读取数字 9,然后读取换行符 '\n'

    使用getcharscanf 读取字符之间的显着区别是,您可以通过在格式字符串中插入空格来跳过使用scanf 读取空白字符,例如

    scanf( " %c", &c );
           ^^^^^
    

    如果你将在上面的演示程序中进行此更改并进入序列

    9
    9
    9
    9
    9
    9
    9
    

    那么程序输出将是

    9
    9
    9
    999999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多