我看到一条评论说,用"\001"初始化char数组将把nul作为第一个字符我已经看到\0在哪里设置了nul。
未经编辑的评论:
char input[SIZE]=”;已足够初始化。当('\001'==input[0])没有执行您认为它正在执行的操作时,如果您已经初始化input[SIZE]=“\001”;(这将创建一个空字符串,其中nul字符作为第一个字符)
本程序

#include <stdio.h>
#define SIZE 8
int main ( void) {
    char input[SIZE] = "\001";

    if ( '\001' == input[0]) {//also tried 1 == input[0]
        printf ( "octal 1\n\n");
    }
    else {
        printf ( "empty string\n");
    }
    return 0;
}

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

所以第一个字符是1而不是'\0'
这是标准行为还是Linux和gcc的一些特性?为什么不设核?

最佳答案

这是标准行为还是Linux和gcc的一些特性?为什么不设核?
您所呈现的代码的行为符合标准的要求在字符串文本和整数字符常量中,八进制转义可以包含一位、两位或三位数字,C标准指定
每个八进制[…]转义序列是
构成转义序列的字符。
C2011, 6.4.4.4/7
在这种情况下,还有一点是相关的,\0是一个八进制转义序列,而不是空字符的特殊独立代码上述引文的大背景将清楚地表明这一点。
在字符串文字"\001"中,反斜杠后跟三个八进制数字,八进制转义可以有三个数字,因此转义序列由反斜杠和所有三个数字组成结果字符串的第一个字符是整数值为1的字符串。
如果出于某种原因,您需要一个字符串文本,该文本由一个空字符后跟十进制数字0和1组成,那么您可以使用完整的三位数转义来表示空字符,

"\00001"

或者像这样分开:
"\0" "01"

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

07-24 09:46
查看更多