我在C:
中写了这个函数print_list
我想检查程序,所以为了模拟EOF,我被告知我需要使用^ D(ctrl + D)。但是,当我使用它时,它只是停止程序,我没有看到print_list
应该显示的输入。结果是:
但是想要的结果(我通过在' \ n'中更换EOF来解决这个问题,只需按回车键):
函数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);
}
:
<table id="selectTerminals" size="35">
<thead>
<tr>
<th>ID</th>
<th>name</th>
<th>Full Name</th>
<th>Configure</th>
</tr>
</thead>
<tbody>
<tr dir-paginate="item in serverData1 | filter:filterData | itemsPerPage: serverData1.length">
<td>{{item.id}}</td>
<td>{{item.abvrName}}</td>
<td>{{item.name}}</td>
<td><p><input class="deleteFromList" name="delete" value="Delete " type="button" ng-click="deleteFromList(item)"/></p></td>
</tr>
</tbody>
知道为何EOF终止程序? 提前谢谢!
答案 0 :(得分:1)
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中没有任何方法可以强制人类用户按行为进行操作。
答案 1 :(得分:0)
尝试while(scanf("%c",&c)!=EOF)
。
这会将输入字符存储到c
,如果您到达EOF
,则scanf
将返回EOF
;这将打破循环 - 基本上是你在代码中尝试做的。
或者,替代解决方案可以是while(scanf("%c",&c)==1)
- 只要scanf
可以成功读取一个字符,循环就会继续,并且当它无法到达时(即 - 当它到达时) EOF
)。
EOF
( Ctrl + d )终止程序而不是处理现有输入:就像在控制台中按 Enter 完成一行输入(也在输入行的末尾添加'\n'
字符),或者按箭头键移动光标在控制台中(不会在输入中添加任何字符),或按 Backspace 从光标的位置删除前一个字符;当您在控制台中输入 Ctrl + d 时,您基本上是在给控制台一个终止程序的命令(通过向控制台发出一个信号,输入流是完成 - 我们认为在控制台中输入EOF
。结果,虽然您在控制台中输入了一些字符 - 但是没有按 Enter 完成输入行(所以基本上程序还没有收到输入),程序在处理输入之前终止。要使程序接收并处理一行输入,必须按 Enter 结束输入行。如果您尝试通过按 Ctrl + d 添加EOF
,然后按 Enter 结束该行,程序将终止而不进行处理那条线。