我想做以下任务:
char complete = '█', blank='░';
但是我得到了以下警告(我正在使用最新版本的gcc):
trabalho3.c: In function ‘entrar’:
trabalho3.c:243:9: warning: multi-character character constant [-Wmultichar]
char complete = '█', blank='░';
^
trabalho3.c:243:3: warning: overflow in implicit constant conversion [-Woverflow]
char complete = '█', blank='░';
^
trabalho3.c:244:23: warning: multi-character character constant [-Wmultichar]
char complete = '█', blank='░';
^
trabalho3.c:244:17: warning: overflow in implicit constant conversion [-Woverflow]
char complete = '█', blank='░';
^
我该怎么做这个作业?
答案 0 :(得分:2)
当我从发布中复制这些行并通过十六进制转储程序回显结果时,输出为:
0x0000: 63 68 61 72 20 63 6F 6D 70 6C 65 74 65 20 3D 20 char complete =
0x0010: 27 E2 96 88 27 2C 20 62 6C 61 6E 6B 3D 27 E2 96 '...', blank='..
0x0020: 91 27 3B 0A .';.
0x0024:
当我通过UTF-8解码器运行时,两个块字符被标识为:
0xE2 0x96 0x88 = U+2588 (FULL BLOCK)
0xE2 0x96 0x91 = U+2591 (LIGHT SHADE)
如果字符长度确实是3个字节,那么尝试将所有三个字节存储到单个字符中会导致问题。
您需要验证这些观察结果;在您的系统和我的系统之间过滤数据的可能性很大。但是,如果您使用类似的工具查看源代码,您可能会发现这些字符是UTF-8或UFT-16编码的,并且这些字符都不适合单个字节。如果您认为它们是单字节代码集中的字符(可能是CP-1252或类似代码集),则应显示包含初始化的代码行的十六进制转储,并标识您正在使用的平台和代码集用。
答案 1 :(得分:0)
您可以将这些字符存储为:
volatile
const unsigned char complete[] = u8"█";
,<wchar.h>
const wchar_t complete = L'█';
,<uchar.h>
尽可能使用UTF-8,必要时使用其他内容。 32位类型是唯一保证固定宽度的类型。标准库中有一些函数用于读取和写入宽字符串,在许多语言环境中,一旦调用const char32_t complete = U'█';
或使用{{setlocale()
将它们转换为宽字符,就可以读取和写入UTF-8字符串。 1}}。