Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C sizeof(字符串)不包括一个\&引用;签名_C_Sizeof - Fatal编程技术网

C sizeof(字符串)不包括一个\&引用;签名

C sizeof(字符串)不包括一个\&引用;签名,c,sizeof,C,Sizeof,我已经对字符串(字符数组)进行了strlen和sizeof,但我没有得到一件事。 我有以下代码: int main() { char str[]="gdb\0eahr"; printf("sizeof=%u\n",sizeof(str)); printf("strlen=%u\n",strlen(str)); return 0; } 代码的输出为: sizeof=9 strlen=3 起初,我非常确定两个单独的字符\后跟0实际上不会充当NUL(\0),但我

我已经对字符串(字符数组)进行了
strlen
sizeof
,但我没有得到一件事。 我有以下代码:

int main() {
    char str[]="gdb\0eahr";
    printf("sizeof=%u\n",sizeof(str));
    printf("strlen=%u\n",strlen(str));
    return 0;
}
代码的输出为:

sizeof=9  
strlen=3
起初,我非常确定两个单独的字符
\
后跟
0
实际上不会充当
NUL
\0
),但我设法弄明白了这一点。 问题是我不知道为什么
sizeof
显示9而不是10。 既然
sizeof
按数据类型统计使用的字节数,为什么它不计算
\
的字节数

在以下示例中:

char str[]="abc";
printf("sizeof=%u\n",sizeof(str));

因为
NUL
值终止了数组,所以会打印出“4”,那么为什么
\
不被计算呢

为什么
char str[]=“gdb\0eahr”
be
10
字节和
sizeof
运算符?它是9个字节,因为有
8
string元素+尾随零

\0
仅为1个字符,而不是2个字符
\
的目的是转义字符,因此您可能会看到其中一些:
\t
\n
\
和其他字符

Strlen返回3,因为字符串终止于位置
str[3]


\
的单个序列用作转义字符,不是字符串大小的一部分。如果你想在字符串中使用
\
,你必须像
\
那样按顺序写两次,那么这是
\
可打印字符的单个
字符。

看起来你已经有了答案:

起初,我非常确定后面跟“0”的两个单独的字符“\”实际上不会充当空“\0”,但我设法弄明白了这一点

序列
\0
是字节0的八进制转义序列。因此,虽然代码中有两个字符表示这一点,但它被转换为字符串中的一个字节


所以你有7个字母字符,中间是一个空字节,最后是一个空字节。这是9个字节。

在字符或字符串常量中,
\
字符标记转义序列的开始,用于表示源字符集中没有符号的字符值。例如,转义序列
\n
表示换行符,
\b
表示退格符,
\0
表示零值字符(也是字符串终止符),等等


在字符串literal
“gdb\0eahr”
中,转义序列
\0
映射到单个0值字符;
str
的实际内容是
{'g','d','b',0','e','a','h','r',0}

作为编译源代码的一部分,C编译器扫描文本字符串,在扫描过程中,任何特殊的转义字符序列都会转换为单个字符。符号反斜杠(\)用于指示转义序列的开始

转义序列有几种格式。最基本的是一个反斜杠,后跟几个特殊字母中的一个。然后将这两个字符翻译成单个字符。其中一些是:

  • “\n”已转换为换行符(0x0A或十进制10)
  • “\t”已转换为制表符(0x09或十进制9)
  • “\r”已转换为回车符(0x0D或十进制13)
  • “\\”已转换为反斜杠字符(0x5C)
这种转义序列的思想在过去被使用,当一行文本被打印到电传打字机、打印机或CRT终端上时,程序员可以使用这些字符和其他特殊的命令代码字符来设置下一个字符的打印位置,或者使设备执行一些物理操作,如按铃或将纸张送入下一行

转义字符还允许在文本字符串中嵌入双引号(“)或单引号(”),以便打印包含引号的文本

除了上面的反斜杠加字母的特殊序列外,还有一种指定任何字符的方法,即使用反斜杠加上一到三个八进制数字(0到7)。因此,您可以使用“\n”或“\12”指定换行字符,其中12是十六进制值a或十进制值10的八进制表示形式

然后引入了使用十六进制转义序列的功能,反斜杠后跟字母x,后跟一个或多个十六进制数字。因此,您可以使用“\n”或“\12”或“\xa”编写换行字符


参见.

<代码>“0”不是2个字符,而是一个(它被翻译成1个),在内存中。所以7个字母字符,和2个代码> 0个0 /代码>(中间一个,一端一个)在内存中,它将是
67 64 62 00 65 61 68 72 00
\0
\n
\t
\a
\x42
,…每个
\sizeof
只有1个字符,不计算源代码中的字节数…它给出了C数据结构的大小。请参阅,您应该使用正确的说明符。=>
%zu
所以如果我理解正确:“\”不算作字符串元素?@Mike.e87它是一个转义字符。如果你想在字符串中包含一个,你必须转义:
“\\”
@tilz0R,好了,现在清楚了。是将“\0”视为转义0(不算数的转义字符,后面跟一个0?)还是视为空字符(在这种情况下,在字符数组的中间)
\0
被视为
0
数字本身。@Mike.e87为什么你已经更改了两次正确答案?我现在明白了!谢谢你,伙计,你是个传奇!我不知道其中两个被翻译成空字符!谢谢!@Mike.e87很高兴我能帮上忙。如果你觉得有用,请随意。