0

我的程序从文件中读取单词,并将它们作为多个单词存储在动态分配的数组中。

我的问题是当我打印数组时在 while 循环中,它似乎指向正确的单词。在代码通过 while 循环后,当我打印所有索引时,'ice' 是最后一个词,我试图找出原因。

FILE *fileptr=fopen("file.txt","r");

char** DataArray;
int num_of_words=0;

char str[10];

while(fscanf(fileptr,"%s",&str)!=-1)
{
    num_of_words++;
}

DataArray=(char**)malloc(num_of_words*sizeof(char*));

rewind(fileptr);

int i=0;

while(fscanf(fileptr,"%s",&str)!=-1)
{
    printf("%s",str);
    int len=strlen(str);
    printf("\t%d",len);

    DataArray[i]=(char*)malloc(len*sizeof(char));
    DataArray[i]=str;
    printf("\t%s\n",DataArray[i]);
    i++;
}

printf("\n");
//printf("%s\n",*(DataArray+2));
printf("%s\n",DataArray[0]);
printf("%s\n",DataArray[1]);
printf("%s\n",DataArray[2]);


fclose(fileptr);

输出:

apple  5   apple
mango  5   mango
ice  3   ice

ice
ice
ice
4

2 回答 2

1

分配一个指针是不够的。特别是当 str 每次通过循环都取一个新值时。

DataArray[i]=(char*)malloc(len*sizeof(char));
DataArray[i]=str;
printf("\t%s\n",DataArray[i]);
i++;

你必须使用strcpy你编写这个程序的方式,因为你已经使用 malloc 分配了空间。您也可以使用 strdup,但这会为您创建动态存储。如果由我决定,我会按照您的方式编写,首先使用 malloc,然后

strcpy(DataArray[i], str);

于 2013-03-10T20:30:38.643 回答
0

DataArray[i] = malloc(len);在此表达式中,malloc 分配len字节并返回指向这些字节的指针。该指针被分配给DataArray[i].

DataArray[i] = str;此表达式将指向 str 的第一个字节的指针分配给DataArray[i],这不是您期望它执行的操作。还记得你从中得到的那个指针malloc吗?它去哪儿了?

我建议使用该strcpy函数,因为它旨在将字符串从一个数组复制到另一个数组:

DataArray[i] = malloc(len + 1); // remember to allow space for a '\0' terminator!
strcpy(DataArray[i], str);

附言。不要强制转换 malloc 的返回值,也不要乘以sizeof (char). 除了使您的代码更难阅读之外,这些都没有意义。这是一个常见的问题,大多数书籍都回答了这个问题。你在看哪本书?

于 2013-03-10T20:24:17.850 回答