簡體   English   中英

用字符串初始化char數組的最佳語法,而忽略空終止符

[英]Nicest syntax to initialise a char array with a string, ignoring the null terminator

我經常想做這樣的事情:

unsigned char urlValid[66] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

...要么:

unsigned char listOfChar[4] = "abcd";

...也就是說,從字符串文字中初始化一個字符數組,並從該文字中忽略空終止符。 這非常方便,而且我可以執行sizeof urlValid並獲得正確的答案。

但不幸的是,它給initializer-string for array of chars is too long的錯誤initializer-string for array of chars is too long

有沒有一種方法可以:

  • 關閉針對此特定事件的錯誤和警告(即,如果初始化char數組時沒有空終止符的空間)
  • 保持便利性和可讀性更好嗎?

您將問題標記為C和C ++。 實際上,在C語言中,您不會收到此錯誤。 相反,終止零根本不會包含在數組中。 即在C語言中,它的工作原理完全符合您的要求。

在C ++中,您確實會得到錯誤。 在C ++中,您可能必須容納終止零,並記住從sizeof的結果中減去1。

還要注意,正如@Daniel Fischer在注釋中建議的那樣,您可以將定義與初始化“解耦”

char urlValid[66]; 
memcpy(urlValid, "ab...", sizeof urlValid);

從而有效地模擬了C ++中C語言的行為。

好吧,在C ++中,您應該始終使用std::string 這很方便,不容易發生內存泄漏等。

但是,您可以在不指定大小的情況下初始化數組:

char urlValid[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

這是可行的,因為編譯器可以從字符串文字中推斷出正確的大小。 另一個優點是,如果文字更改,則不必更改大小。

編輯:您不應該對字符串使用unsigned char

用實際的字符數組初始化嗎?

char urlValid[] = {'a','b','c','d','e','f',...};

有兩個簡單的解決方案。

  1. 您可以像這樣在數組中添加一個額外的元素:

     unsigned char urlValid[67] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; 
  2. 或者一起忽略數組的大小:

     unsigned char urlValid[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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