c - 在C中读取字符时打印

标签 c stream newline printf carriage-return

我正在尝试编写一小段简单的代码来响应箭头键的按下。 我知道 up 由 ^[[A 表示,我有以下代码检查该序列:

     while( 1 )
     {
         input_char = fgetc( stdin );

         if( input_char == EOF || input_char == '\n' )
         {
             break;
         }

         /* Escape sequence */
         if( input_char == 27 )
         {
             input_char = getc( stdin );

             if( input_char == '[' )
             {
                 switch( getc( stdin ) )
                 {
                     case 'A':
                     printf("Move up\n");
                     break;
                 }
             }
         }
     }

每当我按下“向上”键时,转义序列 (^[[A) 就会出现在屏幕上,但“向上移动”直到我按下回车键才会出现。

最终目标是用一些其他数据替换当前行上的文本,所以我尝试这样做

printf("\r%s", "New Text");

代替“向上移动”,但直到按下回车后它仍然不会显示。

我读汉字的方式有问题吗?

谢谢!

编辑 快速说明,它适用于 *nix 系统。

解决方案 谢谢大家指点。我选择了 stepanbujnak 的解决方案,因为它非常简单。我注意到的一件事是,修改字符串的键(退格键等)的许多行为与您预期的不同。它会通过行上的任何东西退格(包括 printf'd 的东西),我必须考虑到这一点。在那之后让其他人排队也不是太糟糕:)

最佳答案

stdin 是行缓冲的,因此 getc(stdin)fgetc(stdin) 在您按下之前不会看到这些字符ENTER 查看此 link了解更多详情

编辑:如果您不想进入ncurses,还有其他有用的方法,例如将终端设置为原始模式等来克服此限制。检查这个不错的 SO 帖子

Capture characters from standard input without waiting for enter to be pressed

关于c - 在C中读取字符时打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228902/

相关文章:

c - Vigenere 未能使用 C 中的 “BaRFoo” 错误进行 check50 测试将 “CaQGon” 加密为 “BaZ”

c - OpenMP 全局私有(private)变量

Node.js - 如何从 process.stdin 读取长字符串(超过 10000 个字符)?

node.js - nodejs fs 看起来很贪婪

linux - 如何停止 GCC 从 obj 文件中的字符串文字中剥离尾随换行符?

c - fgets() 不忽略换行符

c - C语言中的按位运算

c - 我的内存管理哪里出了问题?

azure - SendGrid:如何从 Azure Blob 存储附加文件?

python - 从 csv 文件中删除换行符