使用八进制常量初始化c-char数组



我看到一条评论,说用"01"初始化char数组将把一个nul作为第一个字符。我已经看到在哪里设置了一个nul。

未经编辑的评论:

字符输入[SIZE]=";是足够的初始化。而('\001'==input[0](在初始化input[SIZE]="\001"时不会执行您认为它正在执行的操作;(它创建一个空字符串,以nul字符作为第一个字符。(

此程序

#include <stdio.h>
#define SIZE 8
int main ( void) {
char input[SIZE] = "01";
if ( '01' == input[0]) {//also tried 1 == input[0]
printf ( "octal 1nn");
}
else {
printf ( "empty stringn");
}
return 0;
}

在Linux上运行,使用gcc编译,输出:

octal 1

所以第一个字符是CCD_ 4而不是CCD_
这是Linux和gcc的标准行为,还是只是某些行为?为什么它不设置nul?

这是Linux和gcc的标准行为还是只是一些行为?为什么它不设置nul?

您呈现的代码的行为符合标准的要求。在字符串文字和整数字符常量中,八进制转义可能包含一个、两个或三个数字,而C标准指定

每个八进制[…]转义序列都是可以构成转义序列的字符。

(C2011,6.4.4.4/7(

在这种情况下,是一个八进制转义序列,而不是空字符的特殊、独立的代码,这一点也很重要。以上引用的更广泛的背景将清楚地表明这一点。

在字符串文字"01"中,反斜杠后面跟着三个八进制数字,而八进制转义可以有三个数字,因此转义序列由反斜杠和所有三个数字组成。结果字符串的第一个字符是整数值为1的字符。

如果出于某种原因,您想要一个由null字符后面跟着十进制数字0和1组成的字符串文字,那么您可以用完整的三位转义符来表示null

"0001"

或者像这样拆分:

"" "01"

C将连接相邻的字符串文字以产生所需的结果。

我看到一条评论,说用"\001"初始化char数组会把一个nul作为第一个字符。

该注释有错误。

来自6.4.4.1整数常数,第3段,强调矿:

八进制常数由前缀0组成,可选地,后跟数字0到7的序列

但我们在这里看到的根本不是整数常量。实际上,我们这里有一个八进制转义序列。其定义如下(在6.4.4.4字符常量中(:

octal-escape-sequence:
 octal-digit
 octal-digit octal-digit
 octal-digit octal-digit octal-digit

整数常数和字符常数的定义都是"贪婪的",如第7段所述:

每个八进制或十六进制转义序列都是可以构成转义序列的最长字符序列。

这意味着,如果第一个八进制数字后面跟有可能是八进制数字的东西,则下一个字符被视为属于该常量的八进制数字(在字符常量的情况下最多为三个,而整数常量则不然!(。

因此,您的"01"实际上是一个值为1的字符。

请注意,虽然八进制字符常量最多可运行三个字符(如果需要用前导零填充以获得三位数的长度,则使用此类常量非常安全(,但只要有十六进制数字,十六进制

请参阅http://c0x.coding-guidelines.com/6.4.4.4.html

八进制序列定义为:

octal-escape-sequence:
 octal-digit
 octal-digit octal-digit
 octal-digit octal-digit octal-digit

以及第873项:

八进制转义序列中反斜杠后面的八进制数字被视为单个字符构造的一部分整数字符常量或单个宽字符的宽字符常量。

还有第877项:

每个八进制或十六进制转义序列都是可以构成转义序列的字符。

因此行为是正确的。"\001"在位置0处不应有空字节。

相关内容

  • 没有找到相关文章

最新更新