printf 输出太频繁

Den*_*nan 3 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] = '\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-问题)。

先感谢您。

Rob*_*rtS 5

问题是由两个原因造成的。

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

  2. line[len] = '\0';
    
    Run Code Online (Sandbox Code Playgroud)

    您还尝试写入'\0'不存在的第 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] = '\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)

或者

2.

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)

或者

3.

fillline使用 value 的第三个参数调用该函数29,而不是30

fillline(xs[0], '-', 29);
Run Code Online (Sandbox Code Playgroud)