2
#include <stdio.h>
#include <time.h>
int main(int argc,char *argv[])
{

        int i;
        int array[20];
        srand(time(NULL));
        for (i=0; i<20; i++)
            array[i] = rand()%8999 + 1000;

        char *fname = argv[1];
        FILE *fp;
        fp = fopen(fname,"w");
        fwrite(array,sizeof(int),20,fp );

        fclose(fp);
        return 0;
}

我的程序应该在 1000 到 9999 的范围内生成一个由 20 个随机数组成的序列。我需要创建一个由 20 个数字组成的数组,对其进行排序并传输到通过 cmd 行传递的文件...但是,它说分段错误

4

4 回答 4

2

您获取随机值的公式也是错误的:

使用此代码:

rand()%9999 + 1001;

您将从[1001, 11000]获得值。当您声明您想要[1000, 9999]的范围时。

尝试解决这个更简单的情况,假设[1, 6]中的骰子将是:

rand()%5 + 1

另一个问题是你的 for 循环:

  • 删除 for 循环,你应该没问题。你不需要那个 for 循环来打印数组。如果您真的需要做类似的事情,请检查倒带功能。
于 2013-10-17T21:30:53.093 回答
1
  for (i=0; i<20; i++)
       array[i] = rand()%8999 + 1000; // change random Number logic


   for (i=0; i<20; i++)  

      fprintf(fp,"%d\t",array[i]); // change fwrite(array,sizeof(int),20,fp );

fprintf()

于 2013-10-17T21:40:00.707 回答
1

第一个问题,rand计算是假的,如果你想要一个介于1000和之间的整数9999,那么它应该是:

array[i] = rand()%9000 + 1000; // 9000%9000 = 0 ...

然后,您的调用将fwrite写入缓冲区的全部内容,将其array视为一sizeof (int)组长子字符串。由于您最终获得有效字符编码的可能性非常低,因此当您使用文本编辑器打开文件以查看结果时,您只会得到乱码数据......因此,您的整个for循环是无用的(您将打印array随后到您的文件的全部内容的 20 倍)。

在这里,你可以做的是一个for循环,调用以人类可读的格式fprintf写入array[i]数字,或者只坚持你对fwrite.

然后,我想说您不测试函数调用的返回值。它可能是错误的来源,所以要非常小心。我想到了整个文件操作函数(fopen, fwrite)。

那么,如果argv[1]不存在呢?当调用fopen将运行时,您将遇到分段错误......这是您可以添加的一些检查:

if (argc > 1) {
    fname = argv[1];
} else {
    fname = NULL;
}
于 2013-10-17T21:41:02.433 回答
1

首先检查 的返回值fopen

然后:

fwrite(array,sizeof(int),20,fp );

你没有移动你的array指针。使用类似的东西:

fprintf(fp, "%d\n", array[i]);

还:

array[i] = rand()%9999 + 1001;

如果 产生的值rand()%99999998怎么办?我认为 then9998 + 1001不再介于1000and之间9999。又怎能rand()%9999 + 1001收成1000

于 2013-10-17T21:28:14.140 回答