【问题标题】:scanf infinite loopscanf 无限循环
【发布时间】:2012-04-09 13:33:37
【问题描述】:

此程序获取文件中的第一个数字并指示其后有多少个数字,然后对后面的数字执行各种其他操作。

似乎 scanf 在尝试从文件中读取时导致了无限循环。当我运行程序时,甚至 1 的检查都不起作用

代码如下:

#include <stdio.h>

int main(void) {
        int N, a, n;
        int x=0;
        int t=0;
        printf("1"); //Check
        scanf("%d", &N);
        printf("2"); //Check
        int nums[N];
        int i;
        printf("%d", &N);  //Check
        for (i=0; i<N; i++)
        {
                scanf("%d", &nums[i]);
                t+=nums[i];

                if (nums[i] > x) x=nums[i];

                if (i=0 || nums[i] < n) n = nums[i];
        }
        a = t/N;   
        printf("Number Processed: \t%d\n", &N);
        printf("Maximum: \t%d\n", &x);
        printf("Minimum: \t%d\n", &n);
        printf("Total: \t%d\n", &t);
        printf("Average: \t%d\n", &a);
}

我运行程序的方式是

gcc -lab16
./a.out <in1

in1 是文本并且有数字

7
6
-30
90
3903
-934
443
445

感谢您的宝贵时间。

【问题讨论】:

  • int nums[N]; - 如果你想要一个可变长度的数组 - 你可能需要malloc() 它。另外,尝试将\n 添加到您的“检查”中。
  • 打印快速脏跟踪时,在最后加上\n强制刷新,否则输出不会立即出现。确保您的输入文件在最后一行有一个行尾标记。
  • @amit 我从来没有学过 malloc(),你是什么意思? @dasblinkelight 你的意思是像printf("1"); \n
  • printf("%d", &amp;N); 是未定义的行为,在此之后的代码无话可说。也许你想要printf("%d", N);
  • @JA3N:他的意思是:printf("1\n");malloc() 用于当您需要一个只有在运行时才知道的大小数组时,因为 N 对编译器来说是未知的!

标签: c scanf


【解决方案1】:
if (i=0 || nums[i] < n) n = nums[i];

您正在分配i = 0,因此循环永远不会真正前进!你可能想要i == 0。这导致了无限循环。

其他问题:int nums[N]; - 如果您想要一个动态 [在运行时确定] 大小的数组,您可能需要 malloc() 它。

更新:请注意int nums[N] 在 C99 中有效,因此如果您的分配假设为 C99,则不必担心此问题。否则 - 将需要 malloc()

int* nums = (int*) malloc(sizeof(int) * N)

并且不要忘记在程序结束前free(nums),否则会导致内存泄漏。

【讨论】:

  • 我把动态大小放进去是因为当我没有它编译时,它给出了一个错误说array size missing in nums
  • int nums[N] 在 C99 中是有效的,所以不要在上面欺负他。
  • @RichardJ.RossIII:是的,我将它添加到答案中 - 但他应该确保他的任务假设为 C99。
  • @amit 他说他还没有了解 malloc() 所以我认为他使用的是 C99 :)
  • 不要转换malloc的结果!
【解决方案2】:

这段代码有很多问题。

您误将分配用于比较:

i=0

i 设置为零。你可能是说

i==0

检查i 是否等于零。

您应该检查scanf() 返回的值。当scanf() 读取的数据不符合您指定的格式时,它会将数据留在缓冲区中,下次调用scanf() 会再次看到相同的数据。

第一个printf() 没有打印任何内容的原因很可能是您没有打印任何换行符。请注意,在某些输出设备(如终端)上,输出是行缓冲的。

您将一个指向变量的指针传递给printf(),但您的格式指定了%d。您可能指的是变量本身,而不是指向它的指针。

另外,如果您需要一个长度取决于仅在运行时才知道的值的数组,您需要在堆上分配它,例如使用malloc()

【讨论】:

  • 对于 scanf() 我认为不会有错误的输入。将指向变量的指针传递给 printf() 是什么意思?
  • Adam,请将您的编译器升级到符合 C99 标准的编译器,因为他的代码在 C99 中有效。
  • 您应该处理错误和异常情况。好吧,您将指针作为第二个参数传递给printf()。只需传递变量。
【解决方案3】:
if (i=0 || nums[i] < n) n = nums[i]; 

这是罪魁祸首。当您应该进行比较时,您正在分配i=0i==0

你的循环进入无穷大,因为每次你都是 i 到 0。

此外,您给我们的代码给了我一个错误,因为您在运行时创建了新变量。

#include <stdio.h> 
#include "stdlib.h"
int main(void) { 
    int N, a, n; 
    int x=0; 
    int t=0; 
    int i; 
    int *nums;

    printf("1"); //Check 
    scanf("%d", &N); 
    printf("2"); //Check 

    nums = malloc(N*sizeof(int));

....

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 2013-10-12
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2015-12-27
    • 2022-01-22
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多