提问人:root_roxox 提问时间:4/20/2020 更新时间:10/21/2020 访问量:497
按下 CTRL + D 时如何停止扫描键盘上的数据
How can I stop scanning data on the keyboard when CTRL + D is pressed
问:
我是一个新手程序员。我有一个任务,我对此有一些麻烦。首先,我的任务是:
“假设您从键盘逐个字符扫描土耳其语输入文本,您可以将其视为默认输入设备,直到按下'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.谢谢你的帮助。
答:
1赞
MemReflect
4/20/2020
#1
Ctrl-D对应于 C 中的整数字符文字,因为 A=1、B=2、C=3、D=4。'\4'
您的屏幕截图显示您正在 Windows 上编程,因此您阅读的内容与 Windows 相同并不适用(这是 Unix/Linux/Mac 的东西)。Ctrl-DEOF
要解决问题,您需要阅读直到(或仅阅读 4 个;它们是等效的):'\4'
while ((ch = getchar()) != '\4')
{
message[i] = ch;
i++;
}
请注意,您仍然需要按 或 键才能接受文本行,这意味着您可以在点击将文本提交到您的程序之前键入。但是,程序将停止读取字符,从而导致打印消息 hello world。EnterReturnhello world^D what? i can still type?
Enter^D
将来,您可能会使用类似 in a loop 之类的方法打印您读取的字节值列表。printf("%d %c\n", message[i], message[i]);
评论
0赞
root_roxox
4/20/2020
非常感谢你,但是当我这样做时,我得到了这样的输出。imgur.com/a/Q8eyUIb
1赞
MemReflect
4/20/2020
如果您尝试使用常规 ASCII 字符,您会发现它有效。打印到控制台的奇怪字符的问题与您的系统区域设置和 Windows 控制台使用的字体有关。您可以在 Stack Overflow 和其他站点上找到有关 Windows 控制台中 Unicode 输出的各种问题。可能的解决方法:在程序运行时,您还可以右键单击标题栏并选择“属性”,然后选择“Lucida Console”字体(如果尚未选择),这可能会也可能不会帮助解决输出问题。
0赞
root_roxox
4/20/2020
我做到了,但我仍然有这个问题。你能告诉我我应该怎么做来防止这种情况吗?
1赞
MemReflect
4/20/2020
不幸的是,据我所知,几乎没有其他尝试。Windows 控制台非常有限。另一个可能的解决方法是在您的行之后调用(857 是 Windows 控制台中用于土耳其语的 OEM“代码页”;别忘了)。我不会在 Windows 上编程,所以恐怕我不能告诉你太多其他信息。主要问题是 Windows 程序默认使用 ANSI 代码页,而控制台程序使用 OEM 代码页,并且不一定适用于更改 OEM 代码页。这是 Windows 问题,而不是 C 问题。:(_setmbcp(857)
setlocale
#include <mbctype.h>
setlocale()
评论