【问题标题】:sizeof character and strlen string mismatchsizeof 字符和 strlen 字符串不匹配
【发布时间】:2013-05-21 14:39:48
【问题描述】:

根据我的代码,我假设每个希腊字符存储在 2 个字节中。 sizeof 返回每​​个字符的大小为4(即int的大小)

strlen 如何返回 16 ? [让我觉得每个字符占2个字节](不应该是4*8 = 32吗?既然是计算字节数。)

另外,printf("%c",bigString[i]); 如何正确打印每个字符?它不应该因为%c而读取1个字节(一个字符)然后显示,为什么在这种情况下希腊字符没有被拆分。

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 char sizeof strlen


    【解决方案1】:
    1. C 中的字符文字具有int 类型,因此sizeof('ε')sizeof(int) 相同。你在这个声明中玩火了,有点。 'ε' 将是一个多字符文字,这不是标准的,可能会回来咬你。小心使用像这样的扩展。例如,Clang 不会接受包含该文字的程序。 GCC 会发出警告,但仍会编译它。

    2. strlen 返回 16,因为这是字符串中空终止符之前的字节数。您的希腊字符在 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]);
      

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

    【讨论】:

    • 但是为什么strlen16int 类型的 8 个字符不应该给出 4*8 = 32?
    • 没有。字符文字是int。字符串中的字符是它们需要的任何大小 - 在您的情况下,每个字节看起来像两个字节。
    • 顺便说一句,Visual Studio 中的 sizeof('ε') 打印 1 ......无论哪种方式,这个 'ε' 都不是字符串文字而是字符文字。
    • @Dory,那么您可能正在使用 C++ 编译器。谁说过字符串字面量?
    • @CarlNorum 谢谢。我仍然对printf("%c",bigString[i]); 的工作方式感到困惑。我的意思是它不应该用 UTF-8 c0bigString[0] 显示字符,因为我正在逐字节访问。[它如何使用 c0c0 ,拿起两个字节并显示正确的字符]。我的单一角色不只是一个角色吗? (甚至 gcc 也会警告多字符)
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2011-03-20
    • 2017-10-28
    相关资源
    最近更新 更多