sizeof字符和strlen字符串不匹配

Suv*_*yil 3 c sizeof char strlen

根据我的代码,我假设每个希腊字符以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]);
Run Code Online (Sandbox Code Playgroud)

输出:

Size is 4
 ???????? is of length 16
????????
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 10

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

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

    c0c0 c1c1 c2c2 c3c3 c4c4 c5c5 c6c6 c7c7 0
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. printf出现的工作,因为你的终端是UTF-8意识.您分别打印每个字节,但终端将前两个打印解释为单个字符,依此类推.如果您将该printf呼叫更改为:

    printf("%d: %02x\n", i, (unsigned char)bigString[i]);
    
    Run Code Online (Sandbox Code Playgroud)

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

  • @Dory,你可能正在使用C++编译器.谁说过字符串文字呢? (3认同)