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

时间:2019-02-06 13:55:02

标签: c printf

在调用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

1 个答案:

答案 0 :(得分:5)

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

因此,总是在找不到元音并且之前找到过元音的时候, 和之前的非元音,将打印一个0字节。

重新考虑您的逻辑:)

或者只是更改

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

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