0

我正在尝试将文本文件中的行读入 char 数组,但出现了问题。请查看代码,让我知道我做错了什么。谢谢。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof line, file)!=NULL) {
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }
    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

输入文件 patt 有以下内容。

rec
cent
ece
ce
recent
nt

在执行上面的代码时,我得到了这个

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] nt
string[1] nt
string[2] nt
string[3] nt
string[4] nt
string[5] nt

我期望的是这个

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] rec
string[1] cent
string[2] ece
string[3] ce
string[4] recent
string[5] nt
4

3 回答 3

3

您重复写入同一个数组。

while(fgets(line, sizeof line, file)!=NULL) {

在这一行中,您反复写入数组line


我认为你误解了什么char* string[100];。您将它用作数组数组,而实际上它是一个包含 100 个指针的数组。

要纠正这个问题,您需要首先在每次迭代中分配一个新的内存块:

 string[i] = malloc(strlen(line)+1);

然后你需要将内容复制linestring[i]

strcpy(string[i], line); 

此外,在程序结束时,您将需要使用free来释放内存。

于 2013-01-20T17:12:08.920 回答
2

您的string[i]=line;意思是您将指向同一缓冲区 ( line)的指针重复存储到string. 像这样的东西:

在此处输入图像描述

为了使事情正常进行,您需要为每个要指向的缓冲区分配一个新缓冲区,例如:string[i] = dupe_string(line);,其中dupe_string将是:

char *dupe_string(char const *in) { 
    char *dupe;
    if (NULL != (dupe = malloc(strlen(in) + 1)))
        strcpy(dupe, in);
    return dupe;
}

请注意,由于这用于malloc为每个字符串分配空间,因此您最终需要调用每个字符串free以避免内存泄漏。

于 2013-01-20T17:19:14.163 回答
1

为了帮助您理解您的代码:

  • 您正在写入每次string[i]的地址,而数组的内容在整个循环中不断变化。这导致,所有都包含相同变量的地址,即。在循环结束时,从文件中读取的最后一行存储在数组中。现在,当您打印 string[i] 时,您正在打印变量中存在的数据。由于 string[i] 的所有实例都包含相同的地址,它们都打印相同的值,即在您的输出中。linelinestring[i]linelinelinelinent
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }

*您应该做的是:

int main(void) {
int i=0,j;
char* string[100];
char line[100];
FILE *file; 
file = fopen("patt", "r"); 
while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
    printf("%d %s",i, line);
    string[i]=malloc(strlen(line)+1); ///You need to allocate some memory to char* string[i] here
    if(string[i] == NULL)//Do a NULL check if malloc failed
      //Handle NULL here
    strncpy(string[i],line,strlen(line)+1);//Use strncpy to copy line into the malloced memory in string[i]
    i++;
}

现在,由于您已经分配了用于存储数据的内存,因此您也需要释放内存。所以,而不是在你的代码中:

    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

做这个:

    for (j=0 ; j<i ; j++) {
    printf("string[%d] %s",j, string[j]);
    free(string[j]);
    }
   fclose(file);
   return 0;
}

现在,这应该给你你想要的。

于 2013-01-20T17:31:53.553 回答