我在C语言中编写了此函数:
int process_list(node_t *head){
char c;
node_t *prev = head; /* Define pointer to point the previous node */
head->next = NULL;
head->data = getchar(); /* Insert the first char to the head's data property */
if ( head->data == EOF ) {
return head;
}
while ( (c = getchar()) != EOF ) {
node_t *current = (node_t *) malloc(sizeof(node_t));
current->data = c;
current->next = NULL;
prev->next = current;
prev = current;
}
print_list(head);
return 1;
}
而且我想检查程序,所以为了模拟EOF,我被告知我需要使用^ D(ctrl + D)。但是,当我使用它时,它只是停止了程序,并且没有看到
print_list
应该显示的输入。结果是:但是所需的结果(我通过在'\ n'中替换EOF来模拟这一点,只需按Enter):
函数
print_list
:void print_list(node_t *head) {
node_t * current = head;
printf("The input is:\n");
while ( current != NULL ) {
printf("%c", current->data);
current = current->next;
}
printf("\n");
free_list(head);
}
知道为什么EOF终止程序吗?
提前致谢!
最佳答案
while ( (c = getchar()) != EOF )
循环是错误的,因为c
的类型为char
。getchar()
返回类型为int
的值,该值可以使用unsigned char
表示,也可以使用EOF
表示,这是实现定义的值,通常不能存储在char
中。
将c
的类型更改为int
,而不是char
。
以下注释特定于Unix。
为了按预期工作,用户必须在一行的开头(程序的第一个字符输入,或在换行符之后)输入CTRL-D。
如果在一行字符后按CTRL-D,则需要键入TWICE。第一个CTRL-D将导致在不关闭stdout
的情况下读取前面的字符,而下一个getchar()
的调用将等待另一个字符。到那时,第二个CTRL-D将关闭stdout
,通常导致getchar()
返回EOF
(并且输入CTRL-D以外的内容仅表示继续读取)。
在您的情况下,由于您仅输入一个CTRL-D而不是在行的开头,因此您正在运行程序的环境(例如调试器)要么超时,要么检测CTRL-D,并导致程序终止。但是,这只是一种可能性-您没有提供足够的信息来确认这一点。
除了使用直接读取击键的技术以外,没有其他解决方法-使用标准C无法实现。类似地,在标准C中也没有任何手段可以迫使人类用户进行操作。