【发布时间】:2021-09-19 11:11:00
【问题描述】:
我正在尝试编写一个输出输入字符串 10 次的函数。这是代码。
#include <stdio.h>
int print10times(){
char input[] = "";
printf("Which string would you like to print 10 times? ");
scanf("%s", input);
for (int i=0; i<10; i++){
printf("%s\n", input);
}
return 0;
}
int main(){
print10times();
return 0;
}
我得到的输出如下所示:
Which string would you like to print 10 times? Hello
H
H☺
H☻
H♥
H♦
H♣
H♠
H
H
H
有人可以告诉我为什么这不会打印 10 次“Hello”吗?
谢谢。
【问题讨论】:
-
问题不是 printf - 由于缓冲区溢出,您的 scanf 是 UB。我找不到确切的重复问题,但一些高级信息位于 stackoverflow.com/questions/1621394/…
-
为输入准备更多空间。喜欢
char input[50]。和scnaf("%49s", input) -
@ianfun 谢谢,在 input[] 中输入一个值就可以了。只是好奇,默认情况下,没有值的 char 声明有多少空间?此外,当我像原来的那样拥有 char input[] 时,我可以在 for 循环之外打印整个“Hello”字符串。你知道这是为什么吗?
-
您的声明
char input[] = "";为最多 0 个字符的字符串分配了空间。 :-) (加上尾随\0字节,因此数组的总大小为 1。) -
"我可以在 for 循环之外打印整个“Hello”字符串。你知道这是为什么吗?。读/写无效内存是未定义的行为。UB 表示结果是不可预测的,包括崩溃、错误值、似乎“工作”等。How dangerous is it to access an array out of bounds?