2015-10-27 79 views
-1

基本上,我試圖通過編寫自己sort讓自己熟習C.由於我是從我想過由上述文件的內容複製到一個數組它會讀取文件第一。我需要的是使用mallocrealloc做。到目前爲止,我有這樣的: (r爲我會在以後使用的選項,但我試着從一開始它整合)C:拷貝文件到陣列

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#define BUFFER 1024 

int main (int argc, char **argv) { 

    FILE *f; 
    int ram = 0; 
    char **save; 
    int lines=0; 
    char buff[BUFFER]; 
    size_t size;  

    int o; 
    while ((o = getopt(argc, argv, "r")) != -1) { 
     switch (o) { 
     case 'r': ram++; break; 
     case '?': fprintf(stderr, "Invalid arguments\n"); exit(0); 
     default: printf("Can I even go in here?\n"); break; 
     } 
    } 
    /* argv buildup: 
    argc == 3: 
    0 - prog name 
    1 - opt? 
    2 - filename 
    3 - NULL 
    */ 
    if (argc > (1 + ram)) { 
     f = fopen(argv[1 + ram], "r"); 
     if (f == NULL) { 
      fprintf(stderr, "File does not exist\n"); 
      exit(0);   
     } 

     fgets(buff, BUFFER, f); 
     if (buff != NULL) { 
      save = malloc(strlen(buff) + 1);    
      size = strlen(buff) + 1; 
      /* here's the first segmentation fault */ 
      strcpy(save[lines], buff); 
      lines++;  
     } else { 
      fprintf(stderr, "Either reached end of file or something bad happened\n"); 
     } 

     while ((fgets(buff, BUFFER, f)) != NULL) { 
      save = realloc(save, size + strlen(buff) + 1); 
      size = size + strlen(buff) + 1; 
      strcpy(save[lines], buff); 
      lines++; 
     }  

    } else { 
     fprintf(stderr, "Please start up the program correctly\n"); 
    } 

} 

你可以從評論中的中間看到代碼中,我得到在這一點上分段錯誤,我很誠實,爲什麼它真的發生不確定。應該有足夠的內存可用。我是否錯誤地使用了指針?如果是這樣,我應該如何改變它才能使它起作用?

回答

0
if (buff != NULL) { 
     save = malloc(strlen(buff) + 1);    
     size = strlen(buff) + 1; 
     /* here's the first segmentation fault */ 
     strcpy(save[lines], buff); 
     lines++;  
    } else { 

您爲save分配了錯誤的空間量並且沒有字符串空間。您想要:

save = malloc (sizeof (char *)); 
*save = malloc (strlen (buff) + 1); 

爲一個字符串和該字符串的內容分配空間。要添加額外的字符串,您需要:

save = realloc (save, (lines + 1) * sizeof (char *)); 
saves[lines] = malloc (strlen (buff) + 1); 
strcpy (saves[lines}, buff); 
lines++; 

爲一個字符串和另一個字符串的內容分配空間。

+0

所以我基本上爲指針第一分配空間,只是後來上分配空間,以特定的指針? 如果是這樣,我沒有收到與realloc的一部分。它不應該是這樣的 '節省= realloc的(保存,(線+ 1)*的sizeof(字符*));'因爲不是我添加新的空間,每一個新的字符串我要補充的嗎? – skulpt

+0

@skulpt是的。我有一個額外的'*'在那裏。 –