c# 为什么c中的代码没有结束,并迫使我按crl+z来结束执行?

ccrfmcuu  于 2023-06-27  发布在  C#
关注(0)|答案(2)|浏览(251)

我已经做了一个简单的代码来反向打印字母之间的数字。例如:如果我在终端上写: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;
}
jbose2ul

jbose2ul1#

为什么c中的代码没有结束,并迫使我按crl+z来结束执行?
因为scanf不能读懂你的心思。例如,当您调用scanf("%d", &num[size])时,当前没有任何更多的数据可供读取,scanf不知道您不打算再提供任何数据。在返回之前,它需要看到一个输入结束或错误信号,或者一个与格式不匹配的字符。在Windows中,Ctrl-Z在终端中运行的程序的标准输入上发出输入结束的信号。

wlp8pajw

wlp8pajw2#

我被迫按crl+z才能再次使用终端。
你不能在Windows上运行。在Windows上,终端中的ctrl-z表示EOF(文件结束)。如果你的程序接收到一个EOF freom scanf调用,它将进入一个无限循环。
但你确实写了:
Im被迫按crl+z才能再次使用终端。
在这种情况下,您使用的是 *nix系统(或类似系统)。On *nix ctrl-z表示“暂停”。它将给予终端提示符,但不会结束程序。程序还在后台。运行pidof <program-name>来查看。
关于你的程序的一些评论:

while(scanf(...) != 0)

几乎总是不好的(也许总是不好的)。原因是你不能用这样的代码捕获EOF。
更好的办法是

while(scanf(...) == N)

其中N是您希望扫描的项目数(在您的情况下为1)。这样,EOF就可以工作了。
代码类似

scanf("%s",word)

总是很糟糕非常糟糕。用户可能会使缓冲区溢出。始终限制要读取的最大字符数。在您的情况下,例如:

scanf("%19s",word)

但是,修复上面的问题不会使程序在给予以下内容时结束:
程序将调用外部(第一个)scanf("%d", &num[size])并永远等待,因为它没有接收到进一步的输入。
你可以通过给它两个连续的非整数输入来结束你的程序。示例
如果你想让“end”表示“结束程序”,你可以添加如下代码:

if (strcmp(word, "end") == 0) return 0;

相关问题