[英]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
。
有沒有一種方法可以:
您將問題標記為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',...};
有兩個簡單的解決方案。
您可以像這樣在數組中添加一個額外的元素:
unsigned char urlValid[67] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
或者一起忽略數組的大小:
unsigned char urlValid[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.