簡體   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