在调用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
答案 0 :(得分:5)
在modify
函数中查看程序逻辑。
如果找到元音,则将*vow = 0
设置为0之前的值。
在下一步中,如果找不到元音,则输出*vow
,即
一个空字节。然后,您设置*vow = *ch
。
因此,总是在找不到元音并且之前找到过元音的时候, 和之前的非元音,将打印一个0字节。
重新考虑您的逻辑:)
或者只是更改
if (*vow != *ch)
putchar(*vow)
到
if (*vow != *ch)
if (*vow) putchar(*vow);