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

Max*_*Max 1 c syntax coding-style

我经常想做这样的事情:

unsigned char urlValid[66] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
Run Code Online (Sandbox Code Playgroud)

...要么:

unsigned char listOfChar[4] = "abcd";
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法:

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

AnT*_*AnT 7

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

在C++中,您确实会收到错误.在C++中,您可能必须容纳终止零并记得从结果中减去1 sizeof.

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

char urlValid[66]; 
memcpy(urlValid, "ab...", sizeof urlValid);
Run Code Online (Sandbox Code Playgroud)

从而有效地模拟了C++中C语言的行为.

  • @Nawaz 6.7.9(14)"字符数组的数组可以用字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来.字符串文字的连续字节(包括终止空字符**,如果有的话)是空间还是数组大小未知**)初始化数组的元素." (2认同)
  • @Nawaz:在C99中是6.7.8/14."字符数组的数组可以用字符串文字初始化,可选择用大括号括起来.字符串文字的连续字符(如果有空格或数组大小未知,则包括终止空字符)初始化元素阵列." 注意"如果有空间"部分.这一直是C和C++之间的差异之一. (2认同)