为什么这个C for-loop工作不正常?

时间:2015-04-22 17:54:08

标签: c for-loop input scanf hang

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");
}

出于某种原因,它会挂起,等待更多输入!有什么想法吗?

3 个答案:

答案 0 :(得分: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 :(得分: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]$ 

在我的提示中看到'嘿'有点隐藏,因为你在打印输出中缺少'\ n'新行?

答案 2 :(得分:1)

记得在完成后冲洗。

在聊天中,OP的评论“不......顺便说一句,如果我在打印当前输入的循环中添加一个printf,它会打印除最后一个之外的所有内容......”。这暗示问题出在最后的输出上。

以下内容将数据发送出去打印。但stdout通常是缓冲的。实际输出可能要到一段时间后才会发生。当1)输出包含行尾'\n'时,输出刷新,2)fflush()被调用3)程序结束。当程序结束时,我很惊讶输出没有出现,但可能OP的真实代码与帖子不同。

printf("hey");

更改为

printf("hey\n");

@Cool Guy

printf("hey");
fflush(stdout);

顺便说一句:这也在@Diversity回答中暗示。

注意:最好检查scanf()

的结果
// scanf("%d", &t)
if (1 != scanf("%d", &t)) Handle_BadInput_or_EOF();