为什么这个C语言循环不正常工作?

3
int main()
{
    int t, i;
    int *nums;
    scanf("%d", &t);
    nums = malloc(t * sizeof(int));
    for(i = 0; i < t; i++)
    {
        scanf("%d", &nums[i]);          
    }
    printf("hey");
}

由于某些原因,它挂起了,等待更多的输入!有什么想法吗?

评论不适合进行长时间的讨论;此对话已被移至聊天室 - Taryn
展示一下你正在输入的内容。这可能会显示出实际的问题。 - CroCo
2
在聊天中,OP的评论是“不...顺便说一句,如果我在循环中添加一个打印当前输入的printf语句,它会打印除最后一个之外的所有内容...”。1)所以我必须简单地问一下,您是否在最后一个数字后按了<Enter>键?2)尝试将printf(“hey”);更改为printf(“hey\n”); - chux - Reinstate Monica
@chux,发表一个答案。@OP,在最后一个printf之后使用fflush(stdout); - Spikatrix
我的意思是最后添加 '\n' 修复了问题... 不确定为什么... - Antoni4040
显示剩余4条评论
3个回答

1

这段代码是正确的,除了你没有释放内存(对于这个简单的代码来说不是很大问题),以及你没有检查 scanf 的错误,这可能是导致问题的原因。

下面是一个更好的实现,包括错误检查和正确的内存处理:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, i, ret;
    int *nums;

    ret = scanf("%d", &t);          
    if(ret != 1)
    {
        /* something wrong */
    }

    nums = malloc(t * sizeof(int));
    if(nums==NULL)
    {
        /* memory error */
    }

    for(i = 0; i < t; i++)
    {
        ret = scanf("%d", &nums[i]);          
        if(ret != 1)
        {
            /* something wrong */
        }

    }
    free(nums);
    printf("hey");

    return 0;
}

1
那并没有解释为什么它会在scanf上挂起,或者是在哪个scanf上挂起。 - Michael Dorgan
即使我这样写:int nums[5],它也会挂起。 - Antoni4040
2
它提示说“它挂起了,正在等待更多的输入”,因此这种挂起是非常可疑的。 - Tarantula

1

这只是一个猜测...

但我猜想你运行了它并输入了:

4
1234

例如,您输入4然后是1234,程序卡住了。这是因为1234是第一个数字而不是4个不同的数字,所以它在等待第二个数字。您需要在每个数字之间按下Enter或其他分隔符。
请尝试使用以下一组输入:
4
1234
29
4
5

你应该得到:

你应该得到:

hey

你应该从编程上检查函数调用的返回值。确保malloc没有返回零。确保scanf返回您预期读取的输入数量。添加打印输出以确保读入的值是您所期望或想要的值。
编辑: 猜测程序中有一个在此处未显示的打字错误,比如:
scanf("%s", &t);

或者你已经收到了“嗨”的消息,只是没有看到它。

[ov@MARVIN sotest]$ ./a.out
5 5 4 3 23 1
hey[ov@MARVIN sotest]$ 

看到我的提示中的“hey”有点隐蔽,因为你在打印输出中缺少了换行符“\n”?

你是真的在每个数字之间输入了一个空格,还是按了回车键? - Michael Dorgan

1
记得在完成后刷新。
在聊天中,OP的评论是“不...顺便说一下,如果我在循环中添加一个打印当前输入的printf语句,它会打印除最后一个之外的所有内容...”。这暗示问题出现在最终输出上。
以下发送数据以进行打印。但是,stdout通常是缓冲的。实际输出可能要稍后才能发生。当1)输出包含行末尾'\n'、2)调用fflush() 3)程序结束时,输出被刷新。我很惊讶程序结束时没有出现输出,但OP真正的代码可能与帖子不同。
printf("hey");

改为:

更改为

printf("hey\n");

或者 @酷哥
printf("hey");
fflush(stdout);

顺便说一下:这也暗示在@Diversity的答案中。
注意:检查scanf()的结果总是一个好主意。
// scanf("%d", &t)
if (1 != scanf("%d", &t)) Handle_BadInput_or_EOF();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接