C语言 如何修复运行我的代码后出现的分段错误错误 11



我正在尝试解决有关在 C 中将数据从一个文件移动到另一个文件的问题。 运行程序会给出一个segmentation error 11。我附上了这个问题的图片。习题4

我相信打开文件有问题,我在终端内输入了C代码脚本名称:code.c file1.txt file2.bin -b。这些文件包含在路径中。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char** argv){
size_t k;
char read1[100] = {};
FILE* s;
FILE* d;
if (argc < 4) {
printf("NA");
exit(1);
}
if (strcmp(argv[4], "-b") == 0) {
printf("binary file outputn");
d = fopen(argv[3], "wb");
if (d == NULL) {
printf("cant open d");
exit(1);
}
} else {
if (strcmp(argv[4], "-t") == 0) {
printf("textual file outputn");
d = fopen(argv[3], "w");
} else {
printf("error");
exit(1);
}
}
s = fopen(argv[2], "r");
if (s == NULL) {
printf("cant open s");
exit(2);
}
k = fread(read1,  sizeof(char),100, s);
while (k != 0) {
fwrite(read1,  k,1, s);
k = fread(read1,  sizeof(char),100, s);
}
fwrite(read1,  k,1, s);
fclose(s);
fclose(d);
return 1;
}

我希望将所有数据从file 1移动到file 2file2 output可以是二进制或文本,具体取决于用户输入流。忽略了"十六进制"大小写。

您似乎想编写一个采用输入文件,输出文件和标志(-b-t)名称的程序,所以我想您是这样调用程序的

program infile outfile [-b|-t]

这是3个参数。它们将分别argv[1]argv[2]argv[3]。您不应访问argv[4]。您的程序将在strcmp(argv[4], "-b")上出现段错误。你所有的argv[x]都应该向后移动一个。不过检查if (argc < 4)还可以。

可能导致分段错误的另一件事是从无效的FILE*读取。您没有检查在第二次fopen()之后是否d == NULL。您应该这样做,并在NULL的情况下退出错误。

除此之外,代码的其他问题是:

  1. 退出while循环后,不应调用fwrite。你知道,当出圈时k == 0。它无害,但它是无用的,不会打印任何东西。

  2. 您应该像这样对fwrite的参数进行重新排序:fwrite(read1, 1, k, s).

  3. 你最后return 1语句没有意义,你应该返回0,而不是1,以成功执行程序。

  4. 您不需要使用char read1[100] = {};初始化数组,因为在覆盖其内容之前不会使用它。做char read[100];就好了。

PS:你应该学会使用GDB来调试你的程序。使用GDB很容易发现这样的问题,只需逐个执行说明即可。

相关内容

  • 没有找到相关文章

最新更新