如何打印换行ASCII码?
正在尝试打印具有以下代码的十进制等效值如何打印换行ASCII码?,c,ascii,C,Ascii,正在尝试打印具有以下代码的十进制等效值\n(换行符)。当它被执行时,我按下回车键和Ctrl+Z键,但屏幕上没有打印任何内容。我希望印10张。我错过了什么 #include <stdio.h> int main() { char ch; while ((ch = getchar() != EOF)) { if (ch == '\n') { printf("\\n=%d\n", ch); }
\n
(换行符)。当它被执行时,我按下回车键和Ctrl+Z键,但屏幕上没有打印任何内容。我希望印10张。我错过了什么
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar() != EOF))
{
if (ch == '\n')
{
printf("\\n=%d\n", ch);
}
}
}
#包括
int main()
{
char ch;
while((ch=getchar()!=EOF))
{
如果(ch='\n')
{
printf(“\\n=%d\n”,ch);
}
}
}
这将分配值getchar()!=EOF
至ch
。你可能想写:
while ((ch = getchar()) != EOF)
p.S.ch
应该是int
类型,因为EOF
是一个负值,char
不需要能够表示(char
可能是unsigned
),因此在某些系统上,如果ch
是(错误的)char
,您可能永远看不到该条件计算为false(因此,在这样的系统上会有一个无限循环)
这会将值getchar()!=EOF
分配给ch
。您可能想写:
while ((ch = getchar()) != EOF)
p.S.
ch
应该是int
类型,因为EOF
是一个负值,char
不需要能够表示(char
可能是unsigned
),因此在某些系统上,如果ch
是(错误的)char
,您可能永远看不到该条件计算为false(因此,在这样的系统上会有一个无限循环)关于EOF
问题:事实上更糟糕的是,如果你签署了char
,-1
可能是一个有效字符,这将被误解为EOF
@FelixPalmen,我同意循环无论哪种方式都是错误的,但是char
是未签署的
时的故障模式更有可能被注意到或被视为麻烦。与人们建议避免使用scanf
的语气类似,我建议避免使用getchar
,因为这个原因……你可以使用fread
来改为使用while(fread(&ch,1,1,stdin))来获得更清晰、更容易理解的代码
…@Applik欢迎来到StackOverflow。向上投票和打勾功能是我们感谢他人的方式,在这里…如果这个答案解决了您的问题,请单击“打勾”接受它作为您的解决方案。如果没有,请告诉我…但我认为它解决了您的问题。不客气。:)@Applik C有很多陷阱,但是如果我们避免允许它们的东西,C就会变得无用…缓冲区溢出,所以我们不应该使用数组或strcpy
或memcpy
或任何可能导致这些缺陷的东西…对吗?竞争条件,所以我们应该完全避免线程…goto
,所以我们也应该避免这些…我们应该避免所有这些在这些可以用来编写糟糕代码的工具中,即使它们也可以以合理的方式使用……我们需要回到穴居人时代,使用石头和火,因为刀子太危险了……事实上,火也太危险了……石头……嗯,生活有它的陷阱……关于EOF
问题:如果你有,事实上更糟有符号的char
,-1
可能是一个有效字符,然后会被误解为EOF
@FelixPalmen我同意循环是有故障的,但是char
是无符号的时的故障模式更容易被注意到或被视为麻烦对于scanf
,我建议避免getchar
,因为这个原因……您可以使用fread
来获得更清晰、易于理解的代码,例如while(fread(&ch,1,1,stdin))
…@Applik欢迎来到StackOverflow。upvote和tick功能是我们感谢他人的方式,在这里…如果这个答案解决了您的问题,请单击“tick”接受它作为您的解决方案。如果没有,请让我知道…但我认为它解决了您的问题。不客气。:@Applik C有很多陷阱,但如果我们避免了允许的陷阱,C变得无用。。。缓冲区溢出,所以我们不应该使用数组或strcpy
或memcpy
或任何可能导致这些溢出的东西。。。正当竞争条件,所以我们应该完全避免线程<代码>转到
,所以我们也应该避免。。。我们应该避免使用所有这些工具来编写糟糕的代码,即使它们也可以以合理的方式使用。。。我们需要回到穴居人时代,带着石头和火,因为刀子太危险了。。。事实上,火也太危险了。。。岩石。。。嗯,生活有它的陷阱。。。