C printf输出太频繁
作为从代码生成的命令行输出,但是C printf输出太频繁,c,printf,C,Printf,作为从代码生成的命令行输出,但是 ----------------------------- ((((((((((((((((((((((((((((( ))))))))))))))))))))))))))))) ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 我做错了什么?我尝试了fflush(stdout)和setbuf(stdout,NULL)(尽管我不确定这是否是stdout-问题) 提前感谢。您正在覆盖缓冲区的末尾 ----------------------------
-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
我做错了什么?我尝试了fflush(stdout)
和setbuf(stdout,NULL)
(尽管我不确定这是否是stdout
-问题)
提前感谢。您正在覆盖缓冲区的末尾
-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
void fillline(char*line,char c,int len){
对于(int i=0;i而言,问题的原因有两个
字符串没有空终止符。在printf(“%s”,xs[N])
中将其用作字符串会导致未定义的行为
与
void fillline(char *line, char c, int len){
for(int i = 0; i<len-3; i++)
line[i] = c;
line[len-2] = '\n';
line[len-1] = '\0';
}
您还试图将'\0'
写入不存在的第31个元素
请注意,数组索引从0
开始,而不是从1
开始。正是这种混淆导致了这里的问题
这两种情况下,使用不确定字符串和超出数组边界的写入都会调用
解决方案:
1.
改变
line[len] = '\0';
或
3.
使用值为29
的第三个参数调用函数fillline
,而不是30
void fillline(char *line, char c, int len) {
len--;
for(int i = 0; i < len-1; i++)
line[i] = c;
line[len-1] = '\n';
line[len] = '\0';
}
字符串末尾没有'\0'
,因为您试图在数组上写入,这将导致未定义的行为
有时,在C中不执行绑定检查是个坏主意。您没有为字符串留出空终止符的空间。因此,每一个都流入下一个。如果仔细查看输出模式,首先打印所有4个,然后打印3、2和1。行[len]='\0'
应显示红色标志。您不能指定与字符串长度相等的索引。len-1
是最后一个有效索引。
需要设置为
void fillline(char *line, char c, int len) {
for(int i = 0; i < len-1; i++)
line[i] = c;
line[len-1] = '\n';
line[len] = '\0';
}
void fillline(char *line, char c, int len) {
for(int i = 0; i < len-2; i++)
line[i] = c;
line[len-2] = '\n';
line[len-1] = '\0';
}
void fillline(char *line, char c, int len) {
len--;
for(int i = 0; i < len-1; i++)
line[i] = c;
line[len-1] = '\n';
line[len] = '\0';
}
fillline(xs[0], '-', 29);