C 将无法识别的字符添加到输出中
我在上编程,在程序的输出中收到一些无法识别的字符,这些字符涉及使用C 将无法识别的字符添加到输出中,c,printf,character,clion,C,Printf,Character,Clion,我在上编程,在程序的输出中收到一些无法识别的字符,这些字符涉及使用getchar()函数和字符串。该程序的目标是复制输入,替换一个或多个空格(即),这些空格与一个空格放在一起,然后打印输出。输出字符串包含一些无法识别的字符,形式为菱形方框问号,我不明白为什么。下面是我的代码和两个示例输入输出对供参考: 我的代码: #include <stdio.h> int main() { int c, i = 0; char s[100], g; // i am restrictin
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:
投入2:
产出2:
输入中的^D
表示我使用了Ctrl+D
,以便getchar()
读取EOF正如预期的那样,在返回输出时,输入中多余的空格已被删除,但这些无法识别的字符也会被打印出来,这让我感到困惑
在这些无法识别的字符中,字符的数量似乎在变化,最后一个字符(紧随菱形方框问号之后的字符)是可识别的字符,但也是不必要的。
关于这一点,我有几个问题:
谢谢,如果您有任何帮助,我们将不胜感激。正如@kaylum所指出的,您必须在打印字符串之前终止字符串。作为良好的实践,您可能还希望为变量指定有意义的名称。此外,如果
其他
同样有效,则不需要使用继续
。此外,由于字符串的长度有限,因此最好进行边界检查。也许你想要这样的东西:
int main()
{
int chr, idx = 0;
char str[100], last_chr = '\0';
while ((chr = getchar()) != EOF && idx < 99) {
if (last_chr != ' ' || chr != ' ')
last_chr = str[idx++] = chr;
}
str[idx] = '\0';
printf("%s\n", s);
return 0;
}
intmain()
{
int-chr,idx=0;
char str[100],last_chr='\0';
while((chr=getchar())!=EOF&&idx<99){
如果(最后一个字母)
last_chr=str[idx++]=chr;
}
str[idx]='\0';
printf(“%s\n”,s);
返回0;
}
请注意,将last_chr
(旧的g
)初始化为非空格值,无需在循环中进行另一次测试
顺便说一句,菱形问号字符是当字符不在系统字体中时打印的图形。C中的字符串需要以NUL结尾。添加
s[i]='\0'
在printf
之前。您确定应该使用Ctrl+D
?参考@kaylum谢谢,我这样做了,但无论输入的长度如何,输出中仍然有一个无法识别的字符。当字符串以NULL结尾时,我的问题中提到的其他已识别字符也被删除。@PalLadenCtrl+D
似乎是唯一响应我输入的密钥对,是的,只要在该点结束输入,它就可以很好地工作。在您提供的链接中,对这些问题的回答是,对于基于unix的系统是Ctrl+D
,对于Windows系统是Ctrl+Z
。我使用Windows系统,Ctrl+Z
什么也不做。也许这和IDE有关?谢谢,这已经很好地解释了,它解决了我的问题,我理解了。我想我犯了一个错误,在尝试了@kaylum之前的评论之后,我将I增加了1(使用I++
),然后使用str[idx]='\0'
。另外,感谢您解释钻石问号字符。
Hello, This is me. Welcome
Hi Hello hello
Just Kidding This is me
��������������������������������������B
123 456 789 abc
\n \t 123 145 *&$&)$@
1234567805018308513
^D
123 456 789 abc
\n \t 123 145 *&$&)$@
1234567805018308513
����������������������������������������������:
int main()
{
int chr, idx = 0;
char str[100], last_chr = '\0';
while ((chr = getchar()) != EOF && idx < 99) {
if (last_chr != ' ' || chr != ' ')
last_chr = str[idx++] = chr;
}
str[idx] = '\0';
printf("%s\n", s);
return 0;
}