为什么没有捕获字符串的最后一个字符?

Why is the last character of a string not captured?

当我尝试输出字符串时,n 字符字符串的最后(第 n 个)字符会发生什么情况?

我在下面包含了我的代码、样本输入和输出,突出显示我输入的最后一个字符是 lost

代码:

char buffer[10];
fgets(buffer, sizeof(buffer), stdin);
printf("%s", buffer);
return 0;

输入:

aaaaaaaaab(即 9 个 a 后面跟着 1 个 b

输出:

aaaaaaaaa(9个a的)

要将字符数组视为适当的字符串,其最后一个字符必须是空终止符(或空字节)'[=10=]'

fgets 函数,特别是始终确保将此字符添加到 char 数组中,因此对于 10 的大小参数,它存储数组中的前 9 个字符和最后可用的空字节 space,如果输入大于或等于 9.

请注意,未读字符(例如示例中的 b)将保留在输入缓冲区 stdin 中,并且可能会中断未来的输入读取。

这个空字节充当哨兵,被printf等函数用来知道字符串在哪里结束,不用说这个字符是不可打印的。

如果您将非空终止字符数组传递给 printf,这将等于 undefined behavior

标准库(和其他)中的许多其他函数都依赖于此才能正常工作,因此您必须确保所有字符串都正确地以 null 结尾。