【问题标题】:printf prints invalid characters after each numberprintf 在每个数字后打印无效字符
【发布时间】:2019-02-06 13:55:02
【问题描述】:

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

void modify(char *ch, int *cons, char *vow)
{
    if (strchr(vowels, *ch) == NULL) {
        if (*vow) {
            putchar(*vow);
            *vow = 0;
        }
        ++*cons;
    } else {
        if (*cons) {
            printf("%i", *cons);
            *cons = 0;
        }
        if (*vow != *ch)
            putchar(*vow);
        *vow = *ch;
    }    
}

void print_compressed(char *s)
{
    putchar(toupper(*(s++)));
    int curr = 0;
    int cons = 0;
    char vow = 0;
    while (s[curr]) {
        modify(s + curr, &cons, &vow);
        ++curr;
    }
    modify(s + curr, &cons, &vow);
    putchar('\n');
}

输入: aaabcdefee

预期输出: aa3e1e

终端上的输出与预期相同

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

【问题讨论】:

  • 你的输出和预期的输出是一样的。
  • @Blaze 也许是编辑器问题?见“这个字符在终端上不可见”
  • 我会显示一张图片,等等
  • ^@ 是一个空字节。也许您也在字符串末尾写空字节?
  • 我怀疑 modify(s + cur, …) 行,但 MCVE (minimal reproducible example) 会有所帮助。

标签: c printf


【解决方案1】:

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

所以总是当它没有找到元音并且之前找到了元音时, 而在此之前的非元音,则打印一个 0 字节。

重新思考你的逻辑:)

或者干脆改变

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

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

【讨论】:

  • if (*vow != *ch && *vow != '\0') putchar(*vow);,有些人会将其缩写为if (*vow != *ch && *vow) putchar(*vow);。个人觉得长版本的对称性更好,无论哪种方式编译器都会产生相同的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多