c - sizeof 字符和 strlen 字符串不匹配

标签 c char sizeof 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]);

输出:

Size is 4
 ειδικούς is of length 16
ειδικούς

最佳答案

  1. C 中的字 rune 字具有 int 类型,因此 sizeof('ε')sizeof(int) 相同.你在这个声明中有点儿在玩火。 'ε' 将是一个多字 rune 字,这不是标准的,可能会反过来咬你一口。使用像这样的扩展时要小心。例如,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]);
    

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

关于c - sizeof 字符和 strlen 字符串不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16672773/

相关文章:

c - 使用 difftime for 循环参数

c# - 为什么我们不能有 "char"枚举类型

c - sizeof(int) 是 4 个字节,但只写了两个

c++ - 数组的大小

c - 如何固定结构的分配大小

c - 隐式类型转换 : If one operand is short & the other is char, 将 char 转换为 short?

C 段错误程序

c - 获取字符数组的长度

c++ - 从 int 到 char* 没有字符串,和 fstream 不方便

c - 来自 OS X (C) 接口(interface)的 MAC 地址