c-printf输出过于频繁


#include <stdio.h>

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] = '';
}
int main() {

char xs[4][30];
fillline(xs[0], '-', 30);
fillline(xs[1], '(', 30);
fillline(xs[2], ')', 30);
fillline(xs[3], 'Z', 30);
printf("%s", xs[0]);
printf("%s", xs[1]);
printf("%s", xs[2]);
printf("%s", xs[3]);

}

你好,这里是C编程新手。我对上面的代码有问题。我期待

-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

作为从我的代码中生成的命令行输出,但我得到了

-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

我做错了什么?我尝试了fflush(stdout)setbuf(stdout, NULL)(尽管我肯定不确定这是否是stdout-问题(。

提前谢谢。

问题有两个原因。

  1. 字符串没有null终止符。在printf("%s", xs[N])中将其用作字符串会导致未定义的行为。

  2. line[len] = '';
    

    您还尝试将CCD_ 5写入不存在的第31个元素中。

请注意,数组索引从0开始,而不是从1开始。这种混乱是你在这里惹麻烦的原因。

无论是使用不确定的字符串还是在数组边界之外写入都会调用未定义的行为。


解决方案:

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] = '';
}

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] = '';
}

2

在循环中使用1之前递减len

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] = '';
}

3

使用值为29而非30的第三个参数调用函数fillline

fillline(xs[0], '-', 29);

您正在覆盖缓冲区的末尾。

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] = '';
}

由于您试图重写数组,字符串末尾没有'',这将导致未定义的行为。

有时不在C.中执行绑定检查是个坏主意

最新更新