#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
-问题(。
提前谢谢。
问题有两个原因。
-
字符串没有null终止符。在
printf("%s", xs[N])
中将其用作字符串会导致未定义的行为。 -
带
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.中执行绑定检查是个坏主意