-5

我正在尝试在 c 中实现一个重复的 cat 函数。我遇到分段错误,我无法找到原因。

 #include <stdio.h>
    #include <stdlib.h>




int main(int argc,char *argv[])
{
    char* s;        /* input string */

    int c;

    if(argc==1){


        while (gets(s)){
            puts(s);
        }
    }

    else{

    FILE *file = fopen( "./argv[1]", "r" );
    while((c=fgetc(file))!=EOF){
        fputc(c,stdout);

    }

    fclose(file);   

    }


    return 0;
}
4

4 回答 4

5

您正在读取字符s而不分配内存:

    while (gets(s)){
        puts(s);
    }

首先使用分配一些内存malloc(稍后您将不得不这样free做):

    char *s = malloc(some_buffer_size);

或使其固定:

    char s[some_buffer_size];

顺便提一下gets,因为没有办法限制输入的字符数,这会导致缓冲区溢出。改为使用fgets(buf, sizeof(buf), stdin)

其他人指出了第二个错误,你不能这样调用fopen,改用这个,或者使用 H2CO3 的解决方案:

 FILE *file = fopen( argv[1], "r" );
于 2013-04-16T06:30:08.533 回答
1

gets(s);- 这里s没有初始化指向任何东西。 fopen( "./argv[1]", "r" );- 这是错误的。一定是 -fopen(argv[1], "r" );

于 2013-04-16T06:30:59.653 回答
0

malloc()基本上分配内存。最后,您还需要free()释放变量以释放分配的空间。

你应该用它gdb()来找出错误和调试你的程序。

于 2013-04-16T06:49:20.690 回答
0
fopen( "./argv[1]", "r" );

啊,什么?假设,对吧?

char buf[0x1000];
snprintf(buf, sizeof(buf), "./%s", argv[1]);
FILE *f = fopen(buf, "r");

此外,您正在使用s未初始化的指针(您没有为其分配任何内存),因此您的程序也会调用未定义的行为。

于 2013-04-16T06:31:25.377 回答