2013-03-10 85 views
0

我的程序读取文件中的单词,并将它们作为多个单词存储在动态分配的数组中。指针升级问题的原因是什么?

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

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 
+1

回答了这个一个至少5倍:'DataArray中[i] =的strdup(STR );' – cnicutar 2013-03-10 20:17:46

+0

非常感谢你,是的,修复它:)如果可能的话可以告诉我哪里出了问题,或给出链接,你可能已经回答了这个问题..再次感谢。 – Nilayan 2013-03-10 20:24:23

+0

你在阅读哪本书? – Sebivor 2013-03-10 20:31:09

回答

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);

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)。这些都没有意义,除了让你的代码更难阅读。这是一个常见问题,大多数书籍都回答了这个问题。你在读哪本书?

+0

为什么这会降低投票率?它出什么问题了?我们只是教基本的C语言,当你第一次学习它的时候会感到困惑,尤其是你想分配一个指针,并且字符串被复制。这可能是另一个推动者反对票。 – octopusgrabbus 2013-03-10 20:32:03

+0

我想知道同样的事情。谢谢你问我。我能做些什么来改进我的答案,神秘的选民? – Sebivor 2013-03-10 20:33:50

+0

是的,谢谢你,他们都似乎没有必要;会记住他们。图书:解决问题和程序设计在C,Hanly,Jeri R和Elliot.B Koffman – Nilayan 2013-03-10 20:42:44

相关问题