使用字符串初始化char数组的最好语法,忽略null终止符

时间:2013-01-17 20:02:55

标签: c syntax coding-style

我经常想做这样的事情:

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

...或:

unsigned char listOfChar[4] = "abcd";

...也就是说,从字符串文字中初始化一个字符数组,并忽略该字面值中的null终止符。这非常方便,而且我可以做sizeof urlValid之类的事情并得到正确答案。

但不幸的是,它会出现错误initializer-string for array of chars is too long

有没有办法:

  • 关闭此特定事件的错误和警告(即,在初始化char数组时没有空终止符的空间)
  • 做得更好,保持方便性和可读性吗?

4 个答案:

答案 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)

有两个简单的解决方案。

  1. 您可以在数组中添加一个额外的元素,如下所示:

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

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