gpt4 book ai didi

c - 为 C 打印扩展 ASCII 字符的好方法是什么?

转载 作者:行者123 更新时间:2023-12-01 12:11:31 24 4
gpt4 key购买 nike

首先,我想看看 C 中的 ASCII 可打印字符是什么样的。

以下是我的代码:

#include <stdio.h>
int main(void)
{
for (char a = 32; a < 127; a++)
printf("a=%c\n", a);
return 0;
}
#include <stdio.h>
int main(void)
{
for (unsigned char a = 32; a < 127; a++)
printf("a=%c\n", a);
return 0;
}

上面两个代码片段工作得很好,告诉我有关 ASCII 可打印字符的信息。

现在接下来我想看看 C 的扩展 ASCII 字符。
#include <stdio.h>
int main(void)
{
for (unsigned char a = 128; a < 256; a++)
printf("a=%c\n", a);

return 0;
}

然后是带有未知奇怪字符的无限循环。

我哪里做错了?

我认为当 a 达到 256 时循环会停止,但事实并非如此。

奇怪的字符是从哪里来的?

如何为 C 打印扩展 ASCII 字符?

最佳答案

你有一个无限循环,因为最大值可以用 unsigned char 表示。是 2551,并且增加它超过那个点会导致它回绕到零,所以条件 a < 256永远是真的。如果您使用 int,您的程序将按预期运行反而:

#include <stdio.h>
int main(void)
{
for (int a = 128; a < 256; a++)
printf("a=%c\n", a);
return 0;
}

通过 int 完全没问题到 printf 的 %c ,2 只要它的值在 unsigned char 表示的范围内,它是。

但是,如果您在现代计算机上运行此程序,您仍然可能会遇到“奇怪的字符”。例如,当我在我的计算机上运行它时,我得到 128 行
a=�

这是因为现代计算机的 CLI 窗口需要 UTF-8 编码的 Unicode 文本,而在 UTF-8 中,U+007F 以上的所有字符都使用一个以上的字节进行编码。因此,终端仿真器每行接收一个它认为是无效的、不完整的字节序列,并为它们打印一个特殊的“替换字符”。查看 U+0080..U+00FF 范围内实际字符的最简单方法是使用 C 的“宽字符”:
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
for (int a = 128; a < 256; a++)
wprintf(L"U+%04X = '%lc'\n", a, (wchar_t)a);
return 0;
}
wprintf负责将宽字符转换为环境期望的任何文本编码。这不能保证有效,因为 C 的“宽字符”未指定且设计不当,以至于我实际上建议人们不要在生产代码中使用它们(而是仅使用包含 UTF-8 的窄字符串),但是对于像这样的测试程序通常可以逃脱。我得到这样的输出:
U+0080 = ''
U+0081 = ''
U+0082 = ''
...
U+00A0 = ' '
U+00A1 = '¡'
U+00A2 = '¢'
...
U+00FD = 'ý'
U+00FE = 'þ'
U+00FF = 'ÿ'

如果您的计算机不够现代,您可能会得到一些不同的东西。 U+0080..U+009F 范围是更无用的控制字符,这就是为什么它们不显示任何内容的原因。

1 从技术上讲,[0, 255] 是 unsigned char 所需的最小范围; C 标准允许它可以表示更大范围的可能性,例如[0, 511]。如果您在 unsigned char 的计算机上运行您的程序有那个范围,它会起作用。然而,多年来没有人制造出这样的计算机。如果你真的想担心它,包括 <limits.h>并验证 CHAR_BIT是 8 和/或 UCHAR_MAX是 255。

2 从技术上讲,由于 C 的一个残留特性称为“默认参数提升”,您总是会传递 int%c ,即使您提供的变量具有字符类型。

关于c - 为 C 打印扩展 ASCII 字符的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51402570/

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