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