该代码应该-
但是内部循环只能执行一次。
为什么?
#include <stdio.h>
int main ()
{
int x;
char i, ans;
i = '\0';
do
{
i = '\0';
x=0;
printf("\nEnter sequence of character:");
do
{
i = getchar();
x++;
}
while(i!='\n');
printf("\nNumber of characters entered is: %d", --x);
printf("\nMore sequences (Y/N) ?");
ans = getchar();
}
while(ans =='Y' || ans == 'y');
答案 0 :(得分:2)
在阅读答案为“是/否”(带有ans = getchar();
的行)之后,您将看到一个"y"
和一个"\n"
。您将消耗"y"
并对其进行处理,但是在读取i = getchar();
的下一次迭代中,i
将消耗剩余的"\n"
,因此将中断该do-while循环
尽管这不是我最喜欢的解决方案,但一个简单的解决方法是:
#include <stdio.h>
int main ()
{
int x;
char i, ans;
i = '\0';
do
{
i = '\0';
x=0;
printf("\nEnter sequence of character:");
do
{
i = getchar();
x++;
}
while(i!='\n');
printf("\nNumber of characters entered is: %d", --x);
printf("\nMore sequences (Y/N) ?");
ans = getchar();
getchar();
}
while(ans =='Y' || ans == 'y');
}
因此只消耗多余的"\n"
。仅当您在终端中键入"y"
后再键入"\n"
时,此方法才有效。如果您键入任何多余的字符,则会有不确定的行为。
注意:在您的版本中,尝试输入:"y1234"
,然后在出现提示时输入是否要再次输入。您会发现实际上嵌套的do-while循环有效,并且将计算"y"
之后的4个字符。
答案 1 :(得分:1)
不确定,但是我认为当用户按Enter键完成第一个输入字符时,输入缓冲区将保留,然后将输入按钮作为\n
字符。尝试在if(i == '\n') getChar();
之后添加x++;
。
答案 2 :(得分:1)
发生了什么事
getchar
是从stdin
获取字符的宏。'\n'
)被算作一个单独的
保留在缓冲区中并在下一次检索的字符
getchar()
被调用。可以做什么:
ans = getchar();
之后插入以下内容 i = getchar();
if(i != '\n')
ungetc(i,stdin);
解释了新代码:
ungetc(int x,FILE *stream)
将字符推回输入流。stdin
是<stdio.h>
中定义的标准输入流。'\n'
,则将其放回。