Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf输出太频繁_C_Printf - Fatal编程技术网

C printf输出太频繁

C printf输出太频繁,c,printf,C,Printf,作为从代码生成的命令行输出,但是 ----------------------------- ((((((((((((((((((((((((((((( ))))))))))))))))))))))))))))) ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 我做错了什么?我尝试了fflush(stdout)和setbuf(stdout,NULL)(尽管我不确定这是否是stdout-问题) 提前感谢。您正在覆盖缓冲区的末尾 ----------------------------

作为从代码生成的命令行输出,但是

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


提前感谢。

您正在覆盖缓冲区的末尾

-----------------------------
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
(((((((((((((((((((((((((((((
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
)))))))))))))))))))))))))))))
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
void fillline(char*line,char c,int len){

对于(int i=0;i而言,问题的原因有两个

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

  • 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] = '\0';
    }
    
    您还试图将
    '\0'
    写入不存在的第31个元素

  • 请注意,数组索引从
    0
    开始,而不是从
    1
    开始。正是这种混淆导致了这里的问题

    这两种情况下,使用不确定字符串和超出数组边界的写入都会调用


    解决方案:

    1. 改变

    line[len] = '\0';
    

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

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

    字符串末尾没有
    '\0'
    ,因为您试图在数组上写入,这将导致未定义的行为


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

    您没有为字符串留出空终止符的空间。因此,每一个都流入下一个。如果仔细查看输出模式,首先打印所有4个,然后打印3、2和1。
    行[len]='\0'
    应显示红色标志。您不能指定与字符串长度相等的索引。
    len-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';
    }
    
    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';
    }
    
    fillline(xs[0], '-', 29);