C:Ctl + D退出程序

时间:2017-05-18 10:35:59

标签: c linked-list eof

我在C:

中写了这个函数
print_list

我想检查程序,所以为了模拟EOF,我被告知我需要使用^ D(ctrl + D)。但是,当我使用它时,它只是停止程序,我没有看到print_list应该显示的输入。结果是: enter image description here

但是想要的结果(我通过在' \ n'中更换EOF来解决这个问题,只需按回车键):enter image description here

函数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终止程序? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

while ( (c = getchar()) != EOF )循环不正确,因为c的类型为char

getchar()返回int类型的值,该值可以使用unsigned charEOF表示 - 这是一个实现定义的值,通常是无法存储在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 结束该行,程序将终止而不进行处理那条线。