我的程序从文件中读取单词,并将它们作为多个单词存储在动态分配的数组中。
我的问题是在打印数组时在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
答案 0 :(得分: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);
答案 1 :(得分: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);
PS。不要强制转换malloc的返回值,也不要乘以sizeof (char)
。除了使您的代码更难以阅读之外,其中任何一个都没有意义。这是一个常见问题,大多数书都会回答这个问题。你正在读哪本书?