【问题标题】:C - Input testing for ctrl + characterC - ctrl + 字符的输入测试
【发布时间】:2023-03-23 20:39:01
【问题描述】:

想知道如何测试保存在 char 数组中的输入,例如...

   char input[INPUT_SIZE];

并使用

fgets(input,INPUT_SIZE,stdin);

要从用户那里获取输入,但想知道如何使用 if 语句来测试用户输入是否为例如 ctrl + d 或任何 ctrl + anykey?

我尝试使用这样的 ascci 值.. 是测试 ctrl d 的示例

  if(result = 'EOT') {printf("EOT");}

结果也是一个字符数组。

【问题讨论】:

  • 您的想法是正确的,但'EOT' 不是 Ctrl-D 的 ASCII 值(您正在寻找 4)。您的示例无法编译,或者至少会发出警告。
  • 所以我应该测试它的结果 = 4 吗?
  • if(result = 'EOT') 行在 C 中的很多方面都是错误的。
  • 那你会如何改写它?
  • = 是赋值运算符,不是比较运算符,'EOT' 不是 char。另请阅读fgets 的文档以查看它在缓冲区中存储的确切内容以及何时停止读取。 EOT 的 ASCII 值为 4,尝试运行 this code 并查看输出中是否出现 4。

标签: c input comparison control-characters


【解决方案1】:

您只能测试 Ctrl+d 作为您的读取返回 EOF,请参阅您的读取手册以获取更多信息,但通常它返回 0 . Ctrl+c 也是如此,因为两者都向您的程序发送信号。

对于其他Ctrl+组合键,很大程度上取决于你的系统。

在 linux 上,Ctrl+a 和 Ctrl+e 在 shell 或 emacs 中会将您移动到分别是行的开头或结尾/开头。

最简单的方法是编写一个小程序,使用读取、无缓冲(请参阅ioctl)和 8 字节缓冲区,并在每次退出读取时转储读取的字节。

int nbr;
int i;
char buf[8];

nbr = 42;
while (nbr > 0)
{
  nbr = read(0, buf, 8);
  i = 0;
  while (i < nbr)
    printf("%x ", buf[i++]);
  printf("\n");
}

您将获得 ctrl+key 接收序列的十六进制版本。可能以 \ESC 或 \033 (转义字符序列)开头。例如,向上箭头键看起来像\033[A

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2022-01-11
    • 2018-09-29
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    相关资源
    最近更新 更多