putchar() 函数:不明确的输出
putchar() function: ambiguous output
这是一个简单的代码,试图从字符数组中清除空格,但输出并不像我预期的那样 "YasserMohamed"。
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='\n')
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
您在 x
中的字符串不包含您在循环中用作条件的换行符 '\n'
。
使用 while (x[i]!=0x00)
在终止 NUL
字符 (0x00
) 处结束。
x
中没有 换行符 ('\n'
)。所以,条件是错误的,应该是:
while (x[i]) /* until the null byte is found */
{
if (x[i] != ' ')
putchar(x[i]);
i++;
}
你原来的x
中没有\n
,所以你就继续迭代未初始化的内存,直到碰巧遇到\n
。相反,您应该迭代到字符串终止字符 - [=14=]
:
while (x[i] != '[=10=]') {
// Here --------^
你也可以用0代替'\0'(是完全一样的值),像这样:
for (int i = 0; x[i] != 0; i++) {
if (x[i] != ' ')
putchar(x[i]);
}
空终止字符串的末尾有一个空字符,而不是新行。
你应该把'\n'
改成'[=12=]'
或者0(空字符的ASCII码)。
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='[=10=]')
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
那是因为你写的循环从来没有停止过
while(x[i]!='\n')
{
//What You Want To Do.
}
但是 x[i]
没有 '\n'
任何 x[i]
定义。
如果你把它写成 i!= 14
就可以了。然后 Loop 会在你名字的末尾停止。 Going Beyond 未定义,因为这不是您的可变内存区域。
或者您也可以写成 while(x[i])
,因为 C 中字符串的结尾是 Null 终止的 [=17=]
,其计算结果为 false,因此循环将停止。
正确的代码可能是
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]) //As Null Character '[=11=]' evaluates to false it would stop the loop
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
更新代码:
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='[=10=]')
{
if(x[i]!=' ') {
printf("%c", x[i]); // replace putchar with printf
fflush(stdout); // force character to appear
}
i++;
}
printf("\n"); // print newline so shell doesn't appear right here
return 0 ;
}
字符串以空 [=11=]
字符而非换行符结束。
此外,您应该添加一个 fflush
语句(至少在 linux 上)以确保打印每个字符。
为了使您的输出看起来更漂亮,请在循环后添加一个换行符。
我用 printf
替换了你的 putchar
调用,看看在我 运行 你的程序时是否有帮助。 putchar
也可能会正常工作。
我删除了 system(pause)
因为它似乎没有帮助。我添加了换行符打印。
这是一个简单的代码,试图从字符数组中清除空格,但输出并不像我预期的那样 "YasserMohamed"。
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='\n')
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
您在 x
中的字符串不包含您在循环中用作条件的换行符 '\n'
。
使用 while (x[i]!=0x00)
在终止 NUL
字符 (0x00
) 处结束。
x
中没有 换行符 ('\n'
)。所以,条件是错误的,应该是:
while (x[i]) /* until the null byte is found */
{
if (x[i] != ' ')
putchar(x[i]);
i++;
}
你原来的x
中没有\n
,所以你就继续迭代未初始化的内存,直到碰巧遇到\n
。相反,您应该迭代到字符串终止字符 - [=14=]
:
while (x[i] != '[=10=]') {
// Here --------^
你也可以用0代替'\0'(是完全一样的值),像这样:
for (int i = 0; x[i] != 0; i++) {
if (x[i] != ' ')
putchar(x[i]);
}
空终止字符串的末尾有一个空字符,而不是新行。
你应该把'\n'
改成'[=12=]'
或者0(空字符的ASCII码)。
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='[=10=]')
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
那是因为你写的循环从来没有停止过
while(x[i]!='\n')
{
//What You Want To Do.
}
但是 x[i]
没有 '\n'
任何 x[i]
定义。
如果你把它写成 i!= 14
就可以了。然后 Loop 会在你名字的末尾停止。 Going Beyond 未定义,因为这不是您的可变内存区域。
或者您也可以写成 while(x[i])
,因为 C 中字符串的结尾是 Null 终止的 [=17=]
,其计算结果为 false,因此循环将停止。
正确的代码可能是
#include<stdio.h>
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]) //As Null Character '[=11=]' evaluates to false it would stop the loop
{
if(x[i]!=' ')
putchar(x[i]);
i++;
}
system("pause");
return 0 ;
}
更新代码:
int main()
{
char x[]="Yasser Mohamed";
char ch;
int i=0;
while (x[i]!='[=10=]')
{
if(x[i]!=' ') {
printf("%c", x[i]); // replace putchar with printf
fflush(stdout); // force character to appear
}
i++;
}
printf("\n"); // print newline so shell doesn't appear right here
return 0 ;
}
字符串以空 [=11=]
字符而非换行符结束。
此外,您应该添加一个 fflush
语句(至少在 linux 上)以确保打印每个字符。
为了使您的输出看起来更漂亮,请在循环后添加一个换行符。
我用 printf
替换了你的 putchar
调用,看看在我 运行 你的程序时是否有帮助。 putchar
也可能会正常工作。
我删除了 system(pause)
因为它似乎没有帮助。我添加了换行符打印。