【发布时间】:2009-10-25 21:16:20
【问题描述】:
我正在编写一个程序,它应该读取两个可以包含换行符和各种其他字符的字符串。因此,我使用 EOF(Ctrl-Z 或 Ctrl-D)来结束字符串。
这适用于第一个变量,但是对于第二个变量,这似乎是有问题的,因为显然输入缓冲区中卡住了一些东西并且用户没有输入任何内容。
我尝试使用while (getchar() != '\n'); 和几个类似的变体来清理缓冲区,但似乎没有任何帮助。所有的清洗尝试都导致了一个无限循环,不清洗,添加第二个变量是不可能的。
两个变量的字符都在这样的循环中读取:while((c = getchar()) != EOF),这表明它是我卡在缓冲区中的 EOF。或者它是否以其他方式影响程序的行为?我使用的逻辑有问题吗?
在为此苦苦挣扎了几个小时后,我开始有点绝望了。
代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
int x = 0;
int c;
char a[100];
char b[100];
printf("Enter a: ");
while((c = getchar()) != EOF)
{
a[x] = c;
x++;
}
a[x] = '\0';
x = 0;
/*while (getchar() != '\n'); - the non-working loop*/
printf("\nEnter b: ");
while((c = getchar()) != EOF)
{
b[x] = c;
x++;
}
b[x] = '\0';
printf("\n\nResults:\na: %s\n", a);
printf("b: %s\n", b);
return(0);
}
【问题讨论】:
-
在我的 linux 机器上,它运行良好。
-
它允许您为两个变量输入值?
-
动态记忆:做一个函数来读取输入。我会让这个功能类似于
int read_large_input(char **buf, size_t *len);。我是座右铭“malloc()s 负责free()ing 的功能”的忠实追随者。 -
嗯,缓冲区是向复杂性迈出的又一步,实际上并不是我想要的,因为即使有一个函数和一个缓冲区,数据也需要存储在某个地方,并且存储大小需要在需要时增加......无论如何,我通过尝试一些东西再次自己做了一些事情,并注意到 realloc 似乎解决了这个问题。性能可能有点糟糕,但至少它不会不足或使用太多内存。刚刚在几行上测试了大约 1000 个字符的程序,完全没有问题,所以它似乎可以工作。感谢您的帮助!
标签: c string newline eof getchar