繁体   English   中英

sizeof字符和strlen字符串不匹配

[英]sizeof character and strlen string mismatch

根据我的代码,我假设每个希腊字符以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
ειδικούς
  1. C中的字符文字的类型为int ,因此sizeof('ε')sizeof(int)相同。 你在这个声明中玩火,有点。 'ε'将是一个多字符文字 ,这不是标准的,可能会回来咬你。 小心使用像这样的扩展。 例如,Clang将不接受该程序中包含的字符。 GCC发出警告,但仍会编译它。

  2. strlen返回16,因为这是在null终止符之前的字符串中的字节数。 你的希腊字符在UTF-8中都是16位长,所以你的字符串看起来像:

     c0c0 c1c1 c2c2 c3c3 c4c4 c5c5 c6c6 c7c7 0 

    在内存中,例如, c0c0是第一个字符的两个字节。 有一个在你的字符串中的一个空终止字节。

  3. printf似乎有效,因为您的终端可以识别UTF-8。 分别打印每个字节,但终端将前两个打印解释为单个字符,依此类推。 如果您将该printf调用更改为:

     printf("%d: %02x\\n", i, (unsigned char)bigString[i]); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM