#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;
}
我的程序应生成一个包含20个随机数的序列,范围为1000到9999.我需要创建一个包含20个num的数组,对其进行排序并转移到cmd行传递的文件...但是,它表示分段错误
答案 0 :(得分:2)
获取随机值的公式也是错误的:
使用此代码:
rand()%9999 + 1001;
您将从 [1001,11000] 获取值。如果您声称需要 [1000,9999] 的范围。
尝试解决这个更简单的情况,让我们说 [1,6] 的骰子将是:
rand()%5 + 1
另一个问题是你的for循环:
答案 1 :(得分:1)
首先检查fopen
的返回值。
然后:
fwrite(array,sizeof(int),20,fp );
您没有移动array
指针。使用类似的东西:
fprintf(fp, "%d\n", array[i]);
此外:
array[i] = rand()%9999 + 1001;
rand()%9999
产生的价值为9998
怎么办?我认为9998 + 1001
不再在1000
和9999
之间。另外,rand()%9999 + 1001
如何产生1000
?
答案 2 :(得分: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()
答案 3 :(得分:1)
第一个问题,rand
计算是假的,如果你想要一个介于1000
和9999
之间的整数,那么它应该是:
array[i] = rand()%9000 + 1000; // 9000%9000 = 0 ...
然后,您对fwrite
的调用会写出array
缓冲区的全部内容,被视为一组sizeof (int)
个长子串。由于赔率非常低,您最终会得到有效的字符编码,当您使用文本编辑器打开文件以查看结果时,您将只有乱码数据...因此,您的整个for
循环是无用(您将在文件后面打印array
的全部内容的20倍。)
在这里,你可以做的是for
循环,调用fprintf
以人类可读的格式编写array[i]
号码,或者只需坚持一次调用{fwrite
1}}。
然后,我想说你不测试函数调用的返回值。
它可能是错误的来源,所以要非常小心。我想到了整个文件操作函数(fopen
,fwrite
)。
然后,如果argv[1]
不存在怎么办?当对fopen
的调用运行时,您将遇到分段错误...以下是您可以添加的一点检查:
if (argc > 1) {
fname = argv[1];
} else {
fname = NULL;
}