我有一个程序来测试终端的I / O:
#include <stdio.h>
int main()
{
char *input[100];
scanf("%s", input);
printf("%s", input);
return 0;
}
它与ASCII字符一样工作,但它也适用于Unicode字符和表情符号。
为什么会这样?
答案 0 :(得分:3)
您的代码有效,因为输入和输出流具有相同的编码,并且您不对c
执行任何操作。
基本上,你键入一些东西,然后转换成一个字节序列,然后存储在c
中,然后你将bytes
的序列发送回stdout
转换它们回到可读的角色。
只要编码和解码过程兼容,您就会得到&#34;期望的&#34;结果
现在,如果您尝试使用标准&#34;字符串&#34;会发生什么? C功能?我们假设您输入了&#34;♠您好&#34;在您的终端中,您将获得预期的输出但是:
strlen(c) -> 8
c[0] -> Some strange character
c[3] -> H
你知道吗?您可以在char
数组中存储您想要的任何内容,但这并不意味着您应该这样做。如果要处理扩展字符集,请改用wchar_t
。
答案 1 :(得分:1)
您可能在Linux上运行,终端设置为UTF-8,因此scanf
生成UTF-8,printf
可以输出它。 UTF-8的设计使char[]
可以存储它。我明确使用char[]
而不是char
,因为非ASCII字符需要多个字节。
答案 2 :(得分:1)
您的程序未定义,因为它有未定义的行为。
scanf("%s", input);
需要指向字符串的指针,但是
char *input[100];
input
是指向char
,char *
的指针。
您的程序可能有效,因为您传递给scanf的缓冲区大小足以存储unicode字符,并且您传递的字符之间没有NULL字节,但它可能无法正常工作,因为C的实现在你的(和任何其他)机器上允许在UB的情况下做任何事情。