繁体   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