2013-04-16 63 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()來查找錯誤並調試您的程序。

相關問題