【问题标题】:How can I stop scanning data on the keyboard when CTRL + D is pressed按下 CTRL + D 时如何停止扫描键盘上的数据
【发布时间】:2020-04-20 07:48:34
【问题描述】:

我是一个新手程序员。我有一个任务,对此我有一些麻烦。首先我的任务是:

“假设您从键盘(您可能认为这是默认输入设备)逐个字符地扫描土耳其语输入文本,直到按下“CTRL-D”。您也应该跳过标点符号作为空白字符。每当扫描过程完成时,您的程序将显示字母和数字的频率。您需要讨论数据结构以及流程图解决方案,并与您的代码一起提交。"

我做了一些研究,发现CTRL + D命令对应EOF。我写了我的代码,但它没有按我的意愿工作。这是我的代码。

#include <stdio.h>
#include "stdlib.h"
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "Turkish");    

    char message[1000] = { ' ' };
    char ch;
    int i = 0;

    printf("Please enter your message: ");

    while (ch = getchar() != EOF )
    {
        message[i] = ch;
        i++;
    }

    for (i; i >= 0; i--)
    {
        printf("%c", message[i]);
    }

    printf("\n\n");

    system("PAUSE");
    return 0;
}

当我运行它时,我写了一些东西,然后按 ctrl + d,但正如你在图片中看到的那样,没有任何反应。它只是写了^ D。谢谢你的帮助。

【问题讨论】:

标签: c eof getchar


【解决方案1】:

Ctrl-D 对应于 C 中的整数字符文字 '\4',因为 A=1、B=2、C=3、D=4。

您的屏幕截图显示您正在 Windows 上编程,因此您读到的关于 Ctrl-DEOF 相同的内容不适用(这是 Unix/Linux/Mac 的东西)。

要解决问题,您需要阅读直到 '\4'(或仅 4 个;它们是等效的):

while ((ch = getchar()) != '\4')
{
    message[i] = ch;
    i++;
}

请注意,您仍然需要按 EnterReturn 键才能接受文本行,这意味着您可以在点击 hello world^D what? i can still type? >Enter 将文本提交到您的程序。但是,您的程序将在 ^D 字符处停止读取,从而导致打印消息 hello world

将来,您可能会在循环中使用 printf("%d %c\n", message[i], message[i]); 之类的东西来打印您读取的字节值列表。

【讨论】:

  • 非常感谢你,但是当我这样做时,我得到了这样的输出。 imgur.com/a/Q8eyUIb
  • 如果您尝试使用常规 ASCII 字符,您会发现它有效。将奇怪字符打印到控制台的问题与您的系统区域设置和 Windows 控制台使用的字体有关。您可以在 Stack Overflow 和其他有关 Windows 控制台中的 Unicode 输出的网站上找到 all sorts of questions。一个可能的解决方法:当您的程序运行时,您也可以右键单击标题栏并选择“属性”,然后选择“Lucida Console”字体(如果尚未选择),这可能有助于解决输出问题,也可能没有帮助。
  • 我做到了,但我仍然有这个问题。你能告诉我我应该怎么做才能防止这种情况发生吗?
  • 不幸的是,据我所知,没有什么可以尝试的了。 Windows 控制台非常有限。另一种可能的解决方法可能是在您的setlocale 行之后调用_setmbcp(857)(857 是Windows 控制台中用于土耳其语的OEM“代码页”;不要忘记#include &lt;mbctype.h&gt;)。我不会在 Windows 上编程,所以恐怕我不能告诉你更多其他信息。主要问题是 Windows 程序默认使用 ANSI 代码页,而控制台程序使用 OEM 代码页,而setlocale() 不一定适用于更改 OEM 代码页。这是 Windows 问题,而不是 C 问题。 :(
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多