我正在学习 C,来自 Python,我试图理解为什么 printf() 会有这样的行为。
我的理解是,C 中的字符串是一个字符数组,后跟一个空字符。
如果你像这样声明你的字符串:
char string[] = "I am a string";
printf("char: %lu bytes\n", sizeof(char));
printf("%s\n", string);
printf("%lu\n", sizeof(string));
Run Code Online (Sandbox Code Playgroud)
编译器将隐式在末尾插入空字符。输出:
char: 1 bytes
I am a string
14
Run Code Online (Sandbox Code Playgroud)
请注意 char 的大小为 1 个字节,字符串中有 13 个字符(10 个字母和 3 个空格),字符串的大小为 14 个字节。额外的字节是空字符。
或者,我们像这样声明我们的字符串:
char string2[] = {'h', 'e', 'l', 'l', 'o', '\0'};
printf("%s\n", string2);
printf("%lu\n", sizeof(string2));
Run Code Online (Sandbox Code Playgroud)
我们手动将空字符插入到数组中,当我们打印它或获取其大小时,它的行为与预期一致:
hello
6
Run Code Online (Sandbox Code Playgroud)
但是,如果我们不手动插入空字符,并尝试打印它:
char string3[] = {'w', 'o', 'r', 'l', 'd'};
printf("%s\n", string3);
printf("%lu\n", sizeof(string3));
Run Code Online (Sandbox Code Playgroud)
我们得到(或者至少,在我的机器上,我得到)
worldhello
5
Run Code Online (Sandbox Code Playgroud)
它在末尾打印 string2。我们可以更深入地挖掘一下原因:
char …Run Code Online (Sandbox Code Playgroud) 我试图在 bash 中进行字符串替换,以转义版本号中的点,最终传递给 grep。当我跑步时
echo ${3.9.1//./\\.}
预期输出是3\.9\.1. 我得到一个bad substitution错误。我不明白这怎么不正确。