gpt4 book ai didi

c - 为什么箭头键会弄乱标准输出?

转载 作者:行者123 更新时间:2023-11-30 17:07:40 24 4
gpt4 key购买 nike

我正在用 C 语言编写一个简单的客户端-服务器程序来练习网络编程。服务器可以使用多线程处理多个客户端。每个客户端都在单独的线程中提供服务。客户端使用两个线程:一个从标准输入获取用户输入,另一个打印到标准输出。

我用常规文本测试了该程序,它运行得很好。然而,当我输入箭头键时,它的行为非常奇怪(左键 = ^[[D,右键 = ^[[C,向上键 = ^[[A,向下键 = ^[[B)。

例如,请参阅以下输出:这是我按顺序发送的输入(在客户端中):

>> test
I got your message
>> test1
I got your message
>> test2
I got your message
>> test3
I got your message

这是服务器中的(正确)输出:

Here is the message: test
Here is the message: test1
Here is the message: test2
Here is the message: test3

现在我输入随机箭头键(输入test3后):

>>^[[D^[[A^[[C^[[A^[[D^[[C^[[A^[[D^[[B^[[C^[[D^[[B^[[D^[[C^[[A^[[D^[[C^[[A^[[D^[[A^[[D^[[C^[[A
I got your message

但是,服务器不打印任何内容(我假设字符已转义):

Here is the message: test
Here is the message: test1
Here is the message: test2
Here is the message: test3
Here is the message:

Now, I start inputting normal text:

>> test4
I got your message
>> test5
I got your message
>> test6
I got your message
>> test7
I got your message
>> test8
I got your message
>> test9
I got your message
>> test10
I got your message

当我检查服务器的标准输出时,所有先前的打印输出都被覆盖:

Here is the message: test4
Here is the message: test5
Here is the message: test6
Here is the message: test7
Here is the message: test8
Here is the message: test9
Here is the message: test10

最重要的是,行为会随着我输入的箭头的随机击键而改变。有时,输入不会覆盖服务器的标准输出,但会将输入插入标准输出中。

我不确定为什么会发生这种情况,但是,如果有人想查看我的来源,我可以发布它。源代码并不长 - 客户端和服务器大约 100 行长。

<小时/>

好的,我分别测试了每个键。

向下键和向上键似乎按行移动标准输出中的文件指针。而且左右键似乎没有任何作用。

最佳答案

您将 stdout (这是字节流)与将这些字节输入终端模拟器的结果混淆了。如果您捕获了服务器的stdout 到文件中,您将能够使用十六进制编辑器(或 hd 命令)查看它,并且您将看到发送的实际字节。

终端仿真器获取这些字节并将它们转换为操作,从而导致您的显示屏向您显示某些内容。字节或字节序列可以显示为单个字素(可见符号)或解释为控制代码(移动光标、更改输出或背景颜色等),甚至只是被忽略。

要了解如何解释这些字节,您可以查阅终端仿真器的文档(如果可以找到)或尝试 XTerm documentation 中的有用摘要。 (这是特定于 xterm 但大多数现代终端模拟器都是类似的)或 man 4 console_codes (这是特定于 Linux 控制台的,但又与大多数终端模拟器类似)。

关于c - 为什么箭头键会弄乱标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34002650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com