【发布时间】:2016-05-12 04:20:39
【问题描述】:
我的程序可以编译,但是当我运行它./program -n 3 1000.txt 时,我得到了
分段错误:11。
什么意思?
我的程序做了什么:打印文件的前 10 行。如果文件少于 10 行,则应打印整个文件。该程序不应创建任何文件。它只是将文件的部分内容打印到标准输出。
还应该可以指定打印不同的行数。这将通过将字符串-n 作为第一个参数传递给程序,将要打印的行数作为第二个参数并将文件作为第三个参数来指定。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[]){
int i, n;
char line[1024];
n = atoi(argv[2]);
if(argc == 2){ //eg ./program 1000.txt
FILE * fPointer;
fPointer = fopen("1000.txt", "r");
for(i = 1; i <= 10; i++){
fgets(line, 1024, fPointer);
fprintf(fPointer, "%s\n", line);
}
fclose(fPointer);
} else if(argc == 4){ //eg ./program -n 4 1000.txt
FILE * fPointer;
fPointer = fopen("1000.txt", "r");
for(i = 1; i <= n; i++){
fgets(line, 1024, fPointer);
fprintf(fPointer, "%s\n", line);
}
fclose(fPointer);
} else {
printf("Wrong number of inputs.\n");
}
return 0;
}
【问题讨论】:
-
你的程序做了操作系统不喜欢的事情。您确定可读的
1000.txt存在于正确的路径中吗?添加检查fopen()是否成功是好的。 -
这意味着你正在访问你不应该访问的内存。也许是一个空指针?使用调试器找出答案。 PS:查看
fopen的手册页,如果文件无法打开,它可能会返回null -
使用调试器帮助您找到问题。你真的应该在你的代码中添加错误检查。这将使您的代码更加健壮,也将帮助您调试任何问题。
-
您使用的是 Linux 吗?只需在 GDB 上运行它,它就会显示崩溃的位置以及原因。
-
如果
argc是2,n = atoi(argv[2]);是一个问题。您需要将其移动到if ( argc == 4)下的块内。
标签: c file segmentation-fault arguments