为什么没有捕获字符串的最后一个字符?
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 结尾。
当我尝试输出字符串时,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 结尾。