[英]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
ειδικούς
C中的字符文字的類型為int
,因此sizeof('ε')
與sizeof(int)
相同。 你在這個聲明中玩火,有點。 'ε'
將是一個多字符文字 ,這不是標准的,可能會回來咬你。 小心使用像這樣的擴展。 例如,Clang將不接受該程序中包含的字符。 GCC發出警告,但仍會編譯它。
strlen
返回16,因為這是在null終止符之前的字符串中的字節數。 你的希臘字符在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]);
您將看到您期望的逐字節行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.