C 在stdin中使用嵌套循环而不弄乱缓冲区位置

C 在stdin中使用嵌套循环而不弄乱缓冲区位置,c,nested-loops,C,Nested Loops,我试图基本上检查一个文本是否是回文。这部分代码没有显示在这里,并且工作得非常好。我要做的是,我读入输入,直到有一行结束。然后考虑一个字符串,我检查它是否是回文。但是,我没有在那里结束程序,而是转到下一行,继续迭代,直到达到EOF。我如何在这里做到这一点而不弄乱我的缓冲区位置。我可以在这里使用fseek吗?你永远无法到达回文->推回(回文,ch)(因为中断或跳到下一个迭代) 使用以下命令: while (1) { palindrome = my_string_init_default();

我试图基本上检查一个文本是否是回文。这部分代码没有显示在这里,并且工作得非常好。我要做的是,我读入输入,直到有一行结束。然后考虑一个字符串,我检查它是否是回文。但是,我没有在那里结束程序,而是转到下一行,继续迭代,直到达到EOF。我如何在这里做到这一点而不弄乱我的缓冲区位置。我可以在这里使用fseek吗?

你永远无法到达
回文->推回(回文,ch)(因为中断或跳到下一个迭代)

使用以下命令:

while (1) {
    palindrome = my_string_init_default();
    while (1) {
        ch = getc(stdin);

        if (ch == '\n') {

            break;
        }
        else {

            continue; 
        }

        palindrome->push_back(palindrome, ch);


    }

    if (is_palindrome(palindrome)) {

        printf("Yes \n");

    }
    else {
        printf("No \n");
    }


    palindrome->destroy(&palindrome);



}

return 0;
}
更新。据我所知,您可以这样做(假设每一行,甚至最后一行,都以
\n
结尾,这在UNIX中应该是这样的):


是的,这是我最初的代码(它是有效的),我在上面展示的是一次失败的尝试,试图让它不仅仅适用于一行文本。这只适用于一条生产线。然后程序就结束了。@Byte\u Spike,我不相信你。上面代码的外循环是无限的。按照这个答案修改它不会改变这一点。每一行都是分开的。基本上,如果我插入4行,每行末尾都有一个\n。它运行每一行,并在每一行之后输出结果。我在Case和not loops上做了类似的事情,而且更简单,但这次我没有机会使用Case。也。再一次,我让它只适用于一行代码,如果我不这样做的话,这一点都不难。我将无法知道回文代码是否有效。与后端数据结构和我必须编写的回文程序相比,完成您所展示的工作非常简单。这不是真正的调查。@Byte_Spike*除非您的回文函数或方法中有一个抛出异常,在这种情况下,这些函数或方法并不像您所断言的那样“工作得非常好”。我再次知道我发布的内容是错误的,但正如我所说的,在程序结束之前将其读取超过1行的尝试是失败的。第一部分是琐碎的。这就是为什么我提到fseek可能会提供帮助,因为after(我成功地)能够在一行中阅读,并找出它是否是回文。在我读了下一行之后,检查它的EOF。stdin不同步,它会弄乱下面几行的结果。我不明白您为什么需要在管理
stdin
方面做任何特殊的事情。(您的问题似乎与此无关。)是否有任何原因导致您无法使用
scanf
?(即,从控制台(
stdin
)读取一次
字符串,而不是读取一系列
字符
while (1) {
    ch = getc(stdin);
    if (ch == '\n') {
        break;
    }
    // otherwise:
    palindrome->push_back(palindrome, ch);
}
while (1) {
    palindrome = my_string_init_default();
    while (1) {
        ch = getc(stdin);

        if (ch == '\n' || ch == EOF) {
            break;
        }
        palindrome->push_back(palindrome, ch);
    }

    if (ch != EOF) {
        if (is_palindrome(palindrome)) {
            printf("Yes \n");
        }
        else {
            printf("No \n");
        }
    }

    palindrome->destroy(&palindrome);

    if (ch == EOF) {
        break;
    }
}

return 0;
}