#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] = '\0';
}
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]);
}
Run Code Online (Sandbox Code Playgroud)
你好,这里是 C 编程新手。我上面的代码有问题。我预计
-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Run Code Online (Sandbox Code Playgroud)
作为从我的代码生成的命令行输出,但我得到
-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我试着fflush(stdout)和setbuf(stdout, NULL)(虽然我绝对不知道这是stdout-问题)。
先感谢您。
问题是由两个原因造成的。
字符串没有空终止符。将其用作字符串 inprintf("%s", xs[N])会导致未定义的行为。
和
line[len] = '\0';
Run Code Online (Sandbox Code Playgroud)
您还尝试写入'\0'不存在的第 31 个元素。
请注意,数组索引从 开始0,而不是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';
}
Run Code Online (Sandbox Code Playgroud)
到
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';
}
Run Code Online (Sandbox Code Playgroud)
或者
len在循环中使用前递减1。
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';
}
Run Code Online (Sandbox Code Playgroud)
或者
fillline使用 value 的第三个参数调用该函数29,而不是30。
fillline(xs[0], '-', 29);
Run Code Online (Sandbox Code Playgroud)