小编Hol*_*son的帖子

为什么 printf 打印字符数组的一个额外字节,但前提是最后一个元素不是空字符 \0?

我正在学习 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)

c arrays string printf

1
推荐指数
1
解决办法
929
查看次数

为什么这个 Bash 字符串替换不起作用?

我试图在 bash 中进行字符串替换,以转义版本号中的点,最终传递给 grep。当我跑步时

echo ${3.9.1//./\\.}

预期输出是3\.9\.1. 我得到一个bad substitution错误。我不明白这怎么不正确。

bash parameter-expansion

1
推荐指数
1
解决办法
384
查看次数

标签 统计

arrays ×1

bash ×1

c ×1

parameter-expansion ×1

printf ×1

string ×1