2013-04-16 64 views
-4

我想在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; 
} 
+3

首先,你应该调试你的程序。如果你不知道该怎么做,这是一个完美的时间学习。这几乎总是会立即为您提供错误信息,从而为您节省长时间的搜索时间。其次,你从来没有为s分配内存。最后,你想打开'./argv [1]',而不是'“./argv[1]”'。 – Zeta

+5

啊是的,今天早些时候,每天我写东西到地址什么也没有分配问题。太本地化了,投票结束。 – Lundin

+0

@Lundin是的,恐怕在今天的日常工作中还有更多的这个问题在SO ... -.- – 2013-04-16 06:33:05

回答

5

您正在阅读的字符为s不分配内存:使用malloc第一

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

分配一些内存(你将不得不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"); 
+0

也'fopen(“./argv[1]”,“r”);'请注意第一个参数 –

+1

请[不要在C](http:// stackoverflow)中输入'malloc()'的返回值。 COM /一个/28169分之605858)。 – unwind

+0

噢。感谢名单。但是现在当我试图从文件中读取文件时,我得到了分段错误 – Assasins

1

gets(s); - 在这里s不会初始化为指向任何东西。 fopen("./argv[1]", "r"); - 这是错误的。必须是 - fopen(argv[1], "r");

+0

现在很好用 – Assasins

0
fopen("./argv[1]", "r"); 

咦,什么?假设,对吧?

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

此外,您使用的是s指针未初始化(你不分配任何内存),这样你的程序还调用未定义的行为。

0

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

您应该使用gdb()来查找错误并调试您的程序。

相关问题