我正在尝试创建一个文件并通过命令行打印一系列整数。基本上我想要的是argv[1]
是第一个打印的数字,argv[2]
是最后打印的数字和中间的系列。 argv[3]
将是文件的名称。我的代码如下所示,如果有人能指出任何错误,那就太好了。假设这个例子,收到的参数总是四个。第一次使用文件函数,所以我为任何非常简单的错误道歉。接收非法数组,指针错误。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int array[100];
int first, last, c;
first=atoi(argv[1]);
last=atoi(argv[2]);
c=last-first;
for (int a=0; a<c; a++) {
array[a]=first+a;
}
FILE *fp;
fp = fopen(argv[3], "w");
if (fp == NULL) {
for (int i=0; i<last; i++) {
fprintf(fp, "%d\n", array[i]);
}
}
fclose(fp);
return 0;
}
我的输入如下所示。
./number.c 20 25 5.txt
我输入cat“file_name.txt”时的预期输出如下所示。
cat number.c
20
21
22
23
24
25
但我收到的输出是
ASAN:DEADLY SIGNAL
runtime error-illegal array, pointer or other operation
编辑:问题解决了。
答案 0 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
int first, last;
FILE *fp;
if (argc < 3) { // Check for correct number of args
// print an error message?
return -1;
}
first = atoi(argv[1]);
last = atoi(argv[2]);
fp = fopen(argv[3], "w");
if (fp != NULL) {
for (int i = 0; i <= (first - last); i++) {
fprintf(fp, "%d\n", i + first);
}
fclose(fp);
} else {
//print an error message?
}
return 0;
}
<
更改为<=
,因为:
我想要的是argv [1]是第一个打印的数字,而argv [2]是打印的最后一个数字和中间的系列
if
内移动了fclose()因为:https://stackoverflow.com/a/32674233/2394967 您现在可以添加的是错误处理(检查文件是否成功打开并检查用户输入),但这里可能不需要。
答案 1 :(得分:0)
if (fp == NULL)
应改为
if (fp != NULL)
答案 2 :(得分:0)
你错过了一个&#39;}&#39;在fclose和&#39;之前;&#39;在fopen刚开始编译之后
你的写迭代的界限也是错误的。你应该改变
for (int i=0; i<last; i++)
到
for (int i=0; i<c; i++) {
答案 3 :(得分:0)
在开始阅读或写入文件之前,您应该检查开放是否成功。它会避免很多次试图理解什么是无效的。我并不是说它会导致代码出现问题。但是可能。
尝试类似的东西:
file = fopen(path, mode);
if (file == NULL)
fprintf(stderr, "Could not open file corresponding to this path : %s\n", path);
else {
// code
}
另外,我会避免在不使用数组大小作为循环停止条件的情况下迭代数组。您可能会遇到分段错误。
尝试类似的东西,而不是:
for (int i = 0; i < array.size() 1; i++) {
fprintf(fp, "%d\n", array[i]);
}
在C:
for (int i = 0; i < sizeof(array) 1; i++) {
fprintf(fp, "%d\n", array[i]);
}
有关如何在C here中迭代数组的更多详细信息。