我经常想做这样的事情:
unsigned char urlValid[66] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
...或:
unsigned char listOfChar[4] = "abcd";
...也就是说,从字符串文字中初始化一个字符数组,并忽略该字面值中的null终止符。这非常方便,而且我可以做sizeof urlValid
之类的事情并得到正确答案。
但不幸的是,它会出现错误initializer-string for array of chars is too long
。
有没有办法:
答案 0 :(得分:7)
您将问题标记为C和C ++。实际上在C语言中,您不会收到此错误。相反,终止零根本不会包含在数组中。即在C语言中,它完全按照您希望的方式工作。
在C ++中,您确实会收到错误。在C ++中,您可能必须容纳终止零,并记住从sizeof
的结果中减去1。
另请注意,正如@Daniel Fischer在评论中建议的那样,您可以将定义与初始化“解耦”
char urlValid[66];
memcpy(urlValid, "ab...", sizeof urlValid);
因此有效地模拟了C ++中C语言的行为。
答案 1 :(得分:1)
好吧,在C ++中,你应该总是使用std::string
。它很方便,不容易出现内存泄漏等。
但是,您可以在不指定大小的情况下初始化数组:
char urlValid[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
这是有效的,因为编译器可以从字符串文字中推断出正确的大小。另一个优点是,如果文字更改,则无需更改大小。
编辑:您不应将unsigned char
用于字符串。
答案 2 :(得分:1)
使用实际的字符数组初始化?
char urlValid[] = {'a','b','c','d','e','f',...};
答案 3 :(得分:-1)
有两个简单的解决方案。
您可以在数组中添加一个额外的元素,如下所示:
unsigned char urlValid[67] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
或者一起忽略数组的大小:
unsigned char urlValid[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";