无法识别的字符被添加到输出中
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+D
让getchar()
读取EOF。
正如预期的那样,在返回输出时多余的空格已从输入中删除,但这些无法识别的字符也被打印出来,这让我感到困惑。
在这些无法识别的字符中,字符的数量似乎在变化,最后一个字符(所有菱形问号之后的那个)是可识别的字符,但也是不必要的。
我对此有几个问题:
- 为什么会这样?这可能与我设置为 100 的限制的字符串长度有关吗?
- 这与 IDE 或我的有关吗
算法?
- 值的复制究竟是如何发生的?字符串添加功能中是否存在其他字符?
- 这个问题可以在其他人的帮助下解决吗
方法或函数?
谢谢,如有任何帮助,我们将不胜感激。
正如@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 值可消除在循环中进行另一次测试的需要。
顺便说一句,菱形问号字符是当字符不在您的系统字体中时打印的图形。
我在 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+D
让getchar()
读取EOF。
正如预期的那样,在返回输出时多余的空格已从输入中删除,但这些无法识别的字符也被打印出来,这让我感到困惑。
在这些无法识别的字符中,字符的数量似乎在变化,最后一个字符(所有菱形问号之后的那个)是可识别的字符,但也是不必要的。
我对此有几个问题:
- 为什么会这样?这可能与我设置为 100 的限制的字符串长度有关吗?
- 这与 IDE 或我的有关吗 算法?
- 值的复制究竟是如何发生的?字符串添加功能中是否存在其他字符?
- 这个问题可以在其他人的帮助下解决吗 方法或函数?
谢谢,如有任何帮助,我们将不胜感激。
正如@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 值可消除在循环中进行另一次测试的需要。
顺便说一句,菱形问号字符是当字符不在您的系统字体中时打印的图形。