[英]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.