无法识别的字符被添加到输出中

Unrecognized Characters Getting Added to Output

我在 CLion 2021.1.2 上编程,我在我的程序输出中收到一些无法识别的字符,这些字符涉及 getchar() 函数和字符串的使用。该程序的目标是复制输入,替换一个或多个放置在一起的空白(即 )和一个空白,然后打印输出。输出字符串包含一些菱形问号形式的无法识别的字符,我不明白为什么。下面是我的代码和两个示例输入输出对供参考:

我的代码:

#include <stdio.h>

int main() {

  int c, i = 0;
  char s[100], g; // i am restricting the length of the string to 100

  while ((c = getchar()) != EOF) {
      if (i == 0)
      {
          i++;
          g = (char) c;
          s[0] = (char) c;
          continue;
      }
      if ((c == ' ' ) && (g == ' ')) 
      {
          continue;
      }

      s[i] = (char) c;
      g = (char) c;
      i++;
  }
  printf("%s\n", s);
  return 0;
}

输入 1:

Hello, This is me.     Welcome
Hi      Hello hello
Just Kidding   This is me
123  456 789 111^D

输出 1:

Hello, This is me. Welcome
Hi Hello hello
Just Kidding This is me
��������������������������������������B

输入 2:

123 456   789 abc
\n \t 123 145 *&$&)$@
1234567805018308513
^D

输出 2:

123 456 789 abc
\n \t 123 145 *&$&)$@
1234567805018308513
����������������������������������������������:

输入中的^D表示我使用Ctrl+Dgetchar()读取EOF。
正如预期的那样,在返回输出时多余的空格已从输入中删除,但这些无法识别的字符也被打印出来,这让我感到困惑。
在这些无法识别的字符中,字符的数量似乎在变化,最后一个字符(所有菱形问号之后的那个)是可识别的字符,但也是不必要的。

我对此有几个问题:

  1. 为什么会这样?这可能与我设置为 100 的限制的字符串长度有关吗?
  2. 这与 IDE 或我的有关吗 算法?
  3. 值的复制究竟是如何发生的?字符串添加功能中是否存在其他字符?
  4. 这个问题可以在其他人的帮助下解决吗 方法或函数?

谢谢,如有任何帮助,我们将不胜感激。

正如@kaylum 所指出的,您绝对需要在打印之前终止您的字符串。作为一种好的做法,您可能还想为变量指定有意义的名称。此外,如果 else 也同样有效,则不需要使用 continue。此外,由于您的字符串长度有限,因此最好进行边界检查。也许你想要这样的东西:

int main()
{
    int chr, idx = 0;
    char str[100], last_chr = '[=10=]';
    
    while ((chr = getchar()) != EOF  &&  idx < 99) {
        if (last_chr != ' '  ||  chr != ' ')
            last_chr = str[idx++] = chr;
    }
    str[idx] = '[=10=]';
    printf("%s\n", s);
    return 0;
}

请注意,将 last_chr(您的旧 g)初始化为非 space 值可消除在循环中进行另一次测试的需要。

顺便说一句,菱形问号字符是当字符不在您的系统字体中时打印的图形。