如何为char数组分配内存,如何使用指针?

时间:2014-01-14 21:30:32

标签: c arrays pointers

如上所述,我碰巧在为char数组分配内存时出现问题。分配内存的关键是我想读取一个.txt文件并将其全部保存在一个char数组中以便以后使用它。 (寻找最大的重复字符串)

我现在已经在互联网上找了2个多小时才发布,但是我无法让它工作似乎我错过了一些东西,或者只是不完全理解指针是如何工作的,我真的没有。

评论是德语,就像我希望没有人想到的一些变量。

以下是代码:

# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <string.h>
# include <ctype.h>

# define N 99
# define K 255


main() {

FILE *Test;
long len = 1;
int i = 0;
int k;
// char String[N];          //[100][255] = {" "};
// char* pString;
// pString = String;




Test = fopen("Moby_Dick.txt", "r"); // Datei öffnen, r = lesen | (nicht vergessen DATEINAMEN anzupassen)

    if (fseek(Test, 0L, SEEK_END) != 0) {       //jump ans Ende

        printf("\nFEHLER in SEEK_END");
        fclose(Test);
        return 3;
    }

    if ((len = ftell(Test)) < 0L) {

        printf("\nERROR in ftell");
        fclose(Test);
        return 3;
    }

    if (fseek(Test, 0L, SEEK_SET) != 0) { // jump an den Anfang

        printf("\nERROR in SEEK_SET");
        fclose(Test);
        return 3;
    }

    char *String = (char*)malloc(sizeof(char)*len + 12); //(char*)

    Test = fopen("Eingabe.txt", "r");

    do{
    fgets(String[i], 500, Test); // jede Zeile wird in einem Feld gespeichert
    i++; // zählt die Zeilen hoch 
    }while(!feof(Test)); // lese bis Dateiende

    fclose(Test); // Datei schliessen

     for (k = 0; k < 20; k++) {
     printf("%s\n----------------------------\n", String[k]);
     }
    printf("len = %d\n", len);


return 0;
}

感谢您提供的任何帮助。我想要一个解释,而不是只是传递代码。

2 个答案:

答案 0 :(得分:2)

分配数组后,您可以在单个函数调用中读取整个文件:

FILE* file = fopen("Moby_Dick.txt","rt");

fseek(file,0,SEEK_END);
int size = ftell(file);
fseek(file,0,SEEK_SET);

char* string = (char*)malloc(size+1);
fread(string,size,1,file);
fclose(file);

string[size] = 0;
printf("%s",string);
free(string);

答案 1 :(得分:1)

一些想法

  1. 使用ftell()/fseek() 是一种便携式,也不是查找文件长度的好方法。修复需要在这里做大量工作。现在,让它成为,但知道更好的方法存在。

  2. 不需要演员malloc()。额外的12个字节是任意的,不需要。 sizeof(char)总是1.如果有任何人使用sizeof(*String)

    // char *String = (char*) malloc(sizeof(char) * len + 12); //(char*)
    char *String = malloc(len * sizeof(*String));
    // or
    char *String = malloc(len);
    
  3. 循环do{ fgets(String[i] ... while(!feof(Test));有很多问题。最好做一些@barak manos建议的事情

    // fgets(String[i], 500, Test);
    if (1 != fread(string,size,1,file)) {
      Handle_Readfailure();
    }
    
  4. 匹配您的格式

    // printf("len = %d\n", len);
    printf("len = %ld\n", len);
    
  5. 但解决了上述小问题后,这种方法可能会有所改善。你的目标:

  6.   

    读取一个.txt文件并保存所有文件..以便以后使用它。 (寻找最大的重复字符串)

    要完成此建议:

    1. 阅读文本的每个
    2. 浏览列表寻找“最大重复”。
    3. 以下未经过测试,并且缺少一些错误处理。有改进性能的空间。但它不依赖Test作为文件,它可能是像stdin这样的流。需要添加free() - 缓冲区。它假定最大行长度为1024;

      // Read lines
      size_t LineCount = 0;
      size_t LineSize = 0;
      char **Line = NULL;
      char buffer[1024];
      while (fgets(buffer, sizeof buffer, Test) != NULL) {
        if (LineCount >= LineSize) {
          LineSize = LineSize*2 + 1;
          Line = realloc(Line, LineSize * sizeof(*Line)); // TBD error handling
        }
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len - 1] == '\n') buffer[--len] = '\0';
        len++;
        Line[LineCount] = malloc(len);
        memcpy(Line[LineCount], buffer, len);
        LineCount++;
      }
      fclose(Test);
      
      // search lines
      size_t Longest = 0;
      size_t Index = 0;
      for (size_t i=0; i<LineCount; i++) {
        size_t leni = strlen(Line[i]) + 1;
        if (leni <= Longest) continue; // line too short to beat the best.
        for (size_t j=0; j<i; j++) {
          if (strcmp(Line[i], Line[j]) == 0) {  // duplicate found
            Longest = leni;
            Index = i;
            break;// skip checking Line[i] against Line[j+1] to Line[i-1]
          }
        }
      }
      
      if (Longest > 0) {
        printf("Longest duplicate line is \"%s\".\n", Line[Index]);
      }
      else {
        printf("No duplicates found.\n");
      }