gpt4 book ai didi

c - printf 输出太频繁

转载 作者:行者123 更新时间:2023-12-03 23:26:40 26 4
gpt4 key购买 nike

#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]);

}

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

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

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

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

我做错了什么?我尝试了 fflush(stdout)setbuf(stdout, NULL)(尽管我绝对不确定这是一个 stdout 问题)。

提前谢谢你。

最佳答案

这个问题有两个原因。

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

  2. line[len] = '\0';

    您还尝试将 '\0' 写入不存在的第 31 个元素。

请注意,数组索引从 0 开始,而不是 1。这种困惑是造成您在这里遇到麻烦的原因。

这两件事,使用不确定的字符串和超出数组边界的写入都会调用 undefined behavior .


解决方案:

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

2.

在循环中使用之前将 len1

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

3.

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

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

关于c - printf 输出太频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63219022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com