1

我经常想做这样的事情:

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

...或者:

unsigned char listOfChar[4] = "abcd";

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

但不幸的是它给出了错误initializer-string for array of chars is too long

有没有办法:

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

4 回答 4

7

您将问题标记为 C 和 C++。实际上,在 C 语言中,您不会收到此错误。相反,终止零根本不会包含在数组中。即在 C 中,它完全按照您希望的方式工作。

在 C++ 中,您确实会收到错误消息。在 C++ 中,您可能必须容纳终止零并记住从sizeof.

另请注意,正如@Daniel Fischer 在评论中建议的那样,您可以将定义与初始化“分离”

char urlValid[66]; 
memcpy(urlValid, "ab...", sizeof urlValid);

从而有效地在 C++ 中模拟 C 语言的行为。

于 2013-01-17T20:07:37.947 回答
1

好吧,在 C++ 中,您应该始终使用std::string. 它很方便,不容易出现内存泄漏等。

但是,您可以在不指定大小的情况下初始化数组:

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

这是有效的,因为编译器可以从字符串文字中推断出正确的大小。另一个优点是,如果文字发生变化,您不必更改大小。

编辑:你不应该使用unsigned char字符串。

于 2013-01-17T20:06:12.493 回答
1

用实际的字符数组初始化?

char urlValid[] = {'a','b','c','d','e','f',...};
于 2013-01-17T20:13:21.490 回答
-1

有两个简单的解决方案。

  1. 您可以像这样向数组中添加一个额外的元素:

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

    unsigned char urlValid[] =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
    
于 2013-01-17T20:11:14.757 回答