簡體   English   中英

中文單詞的C語言sizeof,strlen和strncpy

[英]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字符。 strlenwcslen將分別給出字符串中的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因為在某些情況下它不會使其緩沖區為空; 你總是可以用strcpysnprintf替換它。

通常你可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM