根据我的代码,我假设每个希腊字符存储在2个字节中。
sizeof
将每个字符的大小返回为 4 (即sizeof int
)
strlen
如何返回 16 ? [让我觉得每个字符占用2个字节](不应该是4 * 8 = 32?因为它计算字节数。)
另外,printf("%c",bigString[i]);
如何正确打印每个角色?它不应该读取1个字节(一个字符)然后显示因为%c
,为什么希腊字符在这种情况下不会被拆分。
strcpy(bigString,"ειδικούς");//greek
sLen = strlen(bigString);
printf("Size is %d\n ",sizeof('ε')); //printing for each character similarly
printf("%s is of length %d\n",bigString,sLen);
int k1 = 0 ,k2 = sLen - 2;
for(i=0;i<sLen;i++)
printf("%c",bigString[i]);
输出:
Size is 4
ειδικούς is of length 16
ειδικούς
答案 0 :(得分:10)
C中的字符文字类型为int
,因此sizeof('ε')
与sizeof(int)
相同。你在这个声明中玩火,有点。 'ε'
将是多字符文字,这不是标准的,可能会回来咬你。小心使用像这样的扩展。例如,Clang将不接受该程序中包含的字符。 GCC会发出警告,但仍会编译它。
strlen
返回16,因为这是在null终止符之前字符串中的字节数。你的希腊字符在UTF-8中都是16位长,所以你的字符串看起来像:
c0c0 c1c1 c2c2 c3c3 c4c4 c5c5 c6c6 c7c7 0
在内存中,例如c0c0
是第一个字符的两个字节。字符串中有单个空终止字节。
printf
似乎有效,因为您的终端支持UTF-8。您 分别打印每个字节,但终端将前两个打印解释为单个字符,依此类推。如果您将printf
调用更改为:
printf("%d: %02x\n", i, (unsigned char)bigString[i]);
您将看到您期望的逐字节行为。