我已经做了一个简单的代码来反向打印字母之间的数字。例如:如果我在终端上写:1 2 3 hello 4 5 6 end或通过txt在函数中输入其返回的预期值:3 2 1\n 6 5 4\n但它没有结束,我被迫按crl+z才能再次使用终端。
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 64
int main() {
int num[MAX_NUM];
int size = 0, i;
char word[20];
while (scanf("%d", &num[size]) != 0) {
size++;
while(scanf("%d", &num[size]) != 0){
size++;
}
if (scanf("%s",word) != 0 || size == MAX_NUM) {
for (i = size - 1; i >= 0; i--) {
if(i == 0)
printf("%d", num[i]);
else
printf("%d ", num[i]);
}
printf("\n");
size = 0;
}
}
return 0;
}
2条答案
按热度按时间jbose2ul1#
为什么c中的代码没有结束,并迫使我按crl+z来结束执行?
因为
scanf
不能读懂你的心思。例如,当您调用scanf("%d", &num[size])
时,当前没有任何更多的数据可供读取,scanf
不知道您不打算再提供任何数据。在返回之前,它需要看到一个输入结束或错误信号,或者一个与格式不匹配的字符。在Windows中,Ctrl-Z在终端中运行的程序的标准输入上发出输入结束的信号。wlp8pajw2#
我被迫按crl+z才能再次使用终端。
你不能在Windows上运行。在Windows上,终端中的ctrl-z表示EOF(文件结束)。如果你的程序接收到一个EOF freom
scanf
调用,它将进入一个无限循环。但你确实写了:
Im被迫按crl+z才能再次使用终端。
在这种情况下,您使用的是 *nix系统(或类似系统)。On *nix ctrl-z表示“暂停”。它将给予终端提示符,但不会结束程序。程序还在后台。运行
pidof <program-name>
来查看。关于你的程序的一些评论:
几乎总是不好的(也许总是不好的)。原因是你不能用这样的代码捕获EOF。
更好的办法是
其中N是您希望扫描的项目数(在您的情况下为1)。这样,EOF就可以工作了。
代码类似
总是很糟糕非常糟糕。用户可能会使缓冲区溢出。始终限制要读取的最大字符数。在您的情况下,例如:
但是,修复上面的问题不会使程序在给予以下内容时结束:
程序将调用外部(第一个)
scanf("%d", &num[size])
并永远等待,因为它没有接收到进一步的输入。你可以通过给它两个连续的非整数输入来结束你的程序。示例
如果你想让“end”表示“结束程序”,你可以添加如下代码: