C printf在每个数字后打印无效字符

C printf在每个数字后打印无效字符,c,printf,C,Printf,调用print_compressed()时(下面给出的代码),程序会正确打印字符,但在执行printf()后(打印数值),还会打印一个额外的字符。此字符在终端上不可见。但在将输出保存到文件时,它将表示为“^@”(使用nano编辑器) 输入: aaabcdefee 预期产出: Aa3e1e 终端上的输出与预期相同 输出保存为文件时的输出: A^@a3^@e1^@e 查看modify功能中的程序逻辑。 如果找到一个元音,如果之前不是0,则将其设置为*vow=0。 在下一步中,如果找不到元音,则输出*

调用print_compressed()时(下面给出的代码),程序会正确打印字符,但在执行printf()后(打印数值),还会打印一个额外的字符。此字符在终端上不可见。但在将输出保存到文件时,它将表示为“^@”(使用nano编辑器)

输入: aaabcdefee

预期产出: Aa3e1e

终端上的输出与预期相同

输出保存为文件时的输出: A^@a3^@e1^@e


查看
modify
功能中的程序逻辑。 如果找到一个元音,如果之前不是0,则将其设置为
*vow=0
。 在下一步中,如果找不到元音,则输出
*vow
,即 空字节。然后,设置
*vow=*ch

所以当它找不到元音,以前也找过元音的时候, 在这之前是一个非元音,一个0字节被打印出来

重新思考你的逻辑:)

或者干脆改变

if (*vow != *ch)
    putchar(*vow)


查看
modify
功能中的程序逻辑。 如果找到一个元音,如果之前不是0,则将其设置为
*vow=0
。 在下一步中,如果找不到元音,则输出
*vow
,即 空字节。然后,设置
*vow=*ch

所以当它找不到元音,以前也找过元音的时候, 在这之前是一个非元音,一个0字节被打印出来

重新思考你的逻辑:)

或者干脆改变

if (*vow != *ch)
    putchar(*vow)


您的输出和预期的输出是相同的。@Blaze可能是编辑器的问题?请参阅“此字符在终端上不可见”我将显示一个图像,
^@
为空字节。可能您也在字符串末尾写入空字节?我怀疑
modify(s+cur,…)
行,但MCVE()会有所帮助。您的输出和预期的输出是相同的。@Blaze可能是编辑器问题?请参阅“此字符在终端上不可见”我将显示一个图像,
^@
为空字节。也许您也在字符串的末尾写入空字节?我怀疑
modify(s+cur,…)
行,但是MCVE()会有所帮助。或者
if(*vow!=*ch&&*vow!='\0')putchar(*vow)
,如果(*vow!=*ch&&*vow)putchar(*vow),有些人会将其缩短为
。就个人而言,我认为较长版本的对称性更好,编译器将以任何方式生成相同的代码
,如果(*vow!=*ch&&*vow)putchar(*vow),有些人会将其缩短为
。就我个人而言,我认为较长版本的对称性更好,编译器将以任何方式生成相同的代码。
if (*vow != *ch)
    if (*vow) putchar(*vow);