根据我的代码,我假设每个希腊字符都存储在20字节中。
sizeof将每个字符的大小返回为4(即size ofint
如何返回16?[让我觉得每个字符占用2个字节](难道不是4*8=32吗?因为它计算字节数。)
另外,strlen如何正确打印每个字符?它是否应该读取1字节(一个字符),然后由于printf("%c",bigString[i]);而显示,为什么希腊字符在本例中不被拆分。

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
ειδικούς

最佳答案

c中的字符文本具有类型int,因此sizeof('ε')sizeof(int)相同。你在这句话里有点玩火。'ε'将是一个多字符文字,这不是标准,可能会回来咬你。小心使用这种扩展。例如,clang不会接受这个程序中包含的文字。gcc发出警告,但仍将编译它。
strlen返回16,因为这是字符串中空终止符之前的字节数。你的希腊字符在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]);

您将看到预期的逐字节行为。

10-06 16:17
查看更多