C:嵌套的do while循环无法正确循环

时间:2020-06-20 13:14:51

标签: c loops nested-loops do-while

该代码应该-

  • 计算输入序列中的字符数。
  • 重复该操作,直到用户退出程序为止。
  • 使用嵌套的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();
    }
    while(ans =='Y' || ans == 'y');

3 个答案:

答案 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',则将其放回。