2011-04-08 99 views
0

我有类似的东西(没有间距问题),我正在读取文件,字符串之间用#符号分开,并试图将它们中的每一个读入char *的数组中。但是,每个包含字符串的char*很多都是字符串的确切长度。虽然这是一个小错误。C:将字符串文件读入字符数组*

char * fragments[1000]; 
char temp[20]; 
     while (i < numFrags) { 
      if (fscanf(fp, "#%15[^#]#", temp) == 1) { 
      char entry[strlen(temp)]; 
     entry = strcpy(entry, temp); 
     fragments[i++] = entry; 
     printf("%d\n", strlen(temp)); 

      } 
     } 

想法?

+1

“有点小车”没有用。请告诉我们这些错误实际上是什么,例如你的投入,你的期望以及你得到的结果。 – 2011-04-08 17:23:58

+0

char *如何可以“是字符串的确切长度”?或者你的意思是每个char *都必须指向一个长度相等的字符串集合中的一个? – 2011-04-08 17:24:34

+0

我认为“一个小小的车”是OP的隐喻:你看到的每个字符串都包含它携带的字符,就像一辆小马车或一辆红色的小马车一样。我可能是错的。 – 2011-04-08 17:28:44

回答

2

你的问题是你正在重新使用entry数组。

看看如何为所有i我们有fragments[i++] = entry;。最后,每个片段将指向相同的地方,因此将包含相同的字符串(在这种情况下,它将是最后一次读取的字符串)。

看来,如果你试图通过同时使用tempentry阵列来解决这个问题,但最终,你还不如直接已经取得了fscanf写入到阵列entry


,你可以得到的另一个问题是,如果你的指针指向了automaticaly堆栈(即:一个函数内声明的数组)上分配的数组。这些内存位置在你的函数返回后被你的程序重用,你的指针可以开始指向无效数据(因为这是C,使用这些损坏的字符串会导致各种崩溃和不良程序行为)。


你的问题基本上是一个内存分配问题,所以有很多解决方案。

  1. 使fragments是一个字符数组(而不是指针)的数组。这样,您可以安全地为每个字符串分配不同的内存。

    char fragments[2000][20]; //can hold 2000 19-character strings 
    for(i=0; i<N; i++){ 
        scanf("%d", fragments[i]); 
    } 
    

    该解决方案的优点是它很简单,并且所有内存都是预先分配的。

  2. 使用动态内存分配与malloc。这允许您为每个字符串选择不同大小的数组,并且还允许您在运行时而不是编译时选择数组大小。

    char* fragments[2000]; 
    char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings 
    for(i=0; i<N; i++){ 
        scanf("%d", entry[i]); 
        //dynamically allocate an array, just big enough to fit our string in. 
        fragments[i] = malloc(sizeof(char) * (1 + strlen(entry)); 
        strcpy(fragments[i], entry); 
    } 
    

    该方法的主要优点是它非常灵活,但仍然相当简单。主要的缺点是,你需要free所有的指针已经完成malloc - 完成后(否则你可以得到一个内存泄漏)。

  3. 手动执行“动态分配”,使用单个大缓冲区来包含所有字符串。

    char buffer[2000*20]; 
    char* fragments[2000]; 
    char* next_empty_location = buffer; 
    for(i=0; i<N; i++){ 
        scanf("%d", next_empty_location); 
        fragments[i] = next_empty_location; 
        next_empty_location += strlen(next_empty_location) + 1; 
    } 
    

    如果你不能/不想/不允许使用malloc的解决方案,这是最近发生什么。这可能比较难以理解(如果你对C有问题),但最好似乎适合含糊不清的“每个包含字符串的char *都是字符串限制的确切长度”。

+0

+1非常好的答案 – 2011-04-08 20:28:05