【问题标题】:Program prints forever when I run it. Error with array?当我运行它时,程序会永远打印。数组出错?
【发布时间】:2015-02-27 08:47:09
【问题描述】:

目标:

问题 1

程序应从名为“prob1 input.dat”的文件中读取数字,该文件具有以下格式:

(number_of_entries) (entry1) (entry2)...

这意味着文件的第一行包含文件提供的条目数。以下几行定义了每行包含一个条目的条目。在我们的例子中,每个条目都是一个正整数。程序应该读入所有条目并将它们存储在一个数组中。然后程序应该检查数组中的每个值是否是素数,并将结果打印到名为“prob1 output.dat”的文件中。该文件的行数应与文件“prob1 input.dat”提供的数字一样多。在输出文件的每一行中,程序应该打印数字,然后“是素数”或“不是素数”。

顺便说一句,文件中的所有数字都大于 25

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

int main()
{
    FILE *fptr;
    char prob1_input[] = "prob1_input.dat";
    int terms,i;
    int x[]={};

    fptr = fopen(prob1_input, "r");

    if (fptr == NULL)
        printf("Error in opening file %s",prob1_input);

    terms = x[0];

    for(i=0;i<terms;i++)
    {
        fscanf(fptr,"%d",&x[i]);
        terms = x[0];

        for(i=1;x[i]!=2;i++)
        {
            if(x[i]%2 == 0 || x[i]%3 == 0 || x[i]%5 == 0 || x[i]%7 == 0)
            {
                printf("%d is not a prime number\n",x[i]);
                break;
            }
            else if (x[i] == 2 || x[i] == 3 || x[i] == 5 ||  x[i] == 7)
            {
                printf("%d is a prime number\n",x[i]);
                break;
            }
            else
            {
                printf("%d is not a prime number\n",x[i]);
                break;
            }
        }
    }


    return 0;

}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。然后学习如何使用调试器 (gdb)。顺便说一句,您应该测试fscanf 的结果。
  • 你希望这个int x[]={};做什么?
  • 我很难找到int x[]={};的词
  • 在内部和外部循环中使用相同的变量是一个非常糟糕的主意。
  • 在这个terms = x[0]; 分配之后terms 可能携带哪个值?

标签: c arrays loops printf scanf


【解决方案1】:

为此使用一步一步的方法(示例代码假定完全支持 C99):

  1. 定义一个变量来保存即将到来的值的数量。

    size_t terms = 0; 
    
  2. 从文件中读取值的数量以进入您在 1 下定义的变量。

    fscanf(fptr, "%zu", &terms);
    
  3. 要保存要读取的其余值,请定义一个数组,其中读取的元素数小于 2。

    x[1 + terms];
    x[0] = terms;
    
  4. 将 2. 下读取的值的数量读入 3. 下定义的数组中。

【讨论】:

  • 您无法初始化 VLA。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多