[英]C language sizeof, strlen and strncpy for chinese words
我沒有很長時間接觸C語言。 我有一些與中文單詞和strncpy有關的問題。
char* testString = "你好嗎?"
sizeof(testString) => it prints out 4.
strlen(testString) => it prints out 10.
當我想復制到另一個char數組時,我有一些問題。
char msgArray [7]; / *這只是一個例子。 由於某些限制,我們限制了緩沖區大小。 * /
如果我想復制數據,我需要檢查
if (sizeof(testString) < sizeof(msgArray)) {
strncopy(msgArray, testString, sizeof(msgArray));
}
它會有問題。 結果是它只會復制部分數據。
實際上它應該與之相比
if (strlen(testString) < sizeof(msgArray)) {
}
else {
printf("too long");
}
但我不明白為什么會這樣。
如果我想定義限制字符數(包括unicode(例如中文字符),我如何實現定義數組?我想我不能使用char []數組。
非常感謝所有回復。
我的解決方案解決方案:我最終決定剪切字符串以滿足有限的字節。
指針不是數組。 testString
是一個指針,因此, sizeof(testString)
將給出指針的大小而不是它指向的字符串。
strlen
工作方式不同,僅適用於null終止的char
數組和字符串文字。 它給出了null字符前面的字符串的長度。
char* testString = "你好嗎?"
取決於編譯器。 一種選擇是通過%d
輸出單個字符來調查編譯器正在做什么。 它可能會生成UTF-8字面值。
在C11標准中,您可以編寫以下內容之一:
char const *testString = u8"你好嗎?"; // UTF-8 encoding
要么
wchar_t const *testString = u"你好嗎?"; // UTF-16 or UCS-4 encoding
使用這些字符串,標准C中無法使用Unicode字符 。 您只能使用代碼點和/或C字符。 strlen
或wcslen
將分別給出字符串中的C字符數,但這可能與顯示的字形數不對應。
如果您的編譯器不符合最新標准(即它為上述行提供了錯誤),那么要編寫可移植代碼,您只需要在源文件中使用ASCII。
要在字符串文字中嵌入unicode,可以使用帶有UTF-8十六進制代碼的'\\xNN'
。
在這兩種情況下,最好的選擇可能是使用第三方Unicode庫,例如ICU。
對於問題的第二部分,我假設你使用的是UTF-8。 strlen(testString) + 1
是您需要復制的字符數。 你說你堅持使用固定大小的7字節緩沖區。 如果這是真的那么代碼可以是:
char buf[7];
if ( strlen(testString) > 6 )
exit(1); // or jump to some other error handling
strcpy(buf, testString);
應該避免使用strncpy
因為在某些情況下它不會使其緩沖區為空; 你總是可以用strcpy
或snprintf
替換它。
通常你可以使用wchar_t來表示UTF字符(非英文字符),每個字符可能需要2或4個字節。 如果你真的想快速計算字符數,請使用uint32_t(unsigned int)而不是char / wchar_t,因為UTF32保證每個字符(包括非英文字符)將具有相同的4字節大小。
sizeof(testString)只會給你一個指針本身的大小,在32位系統中為4,在64位系統中為8。
如果你正在使用wchar_t,請使用wcslen來獲取字符串len; 如果你正在使用uint32_t,你需要編寫自己的strlen函數,如下所示:
size_t strlenU32(const uint32_t *s) {
const uint32_t *u = s;
while (*u) u++;
return u - s;
}
我不是親,但你可以嘗試這樣的事情:
char* testString = "你好嗎?\0"; //null-terminating char at the end
int arr_len = 0;
while(testString[arr_len])
arr_len++;
結果,它返回10,這是數組字段的數量,因此如果將它乘以單字節的大小,您將獲得字符串的實際長度。
此致,Paweł
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.