2014-10-11 83 views
0

该分配是从文本文件读取单词,然后将它们反向打印到另一个文本文件。我在将读入的单词放入数组中时遇到问题。我不应该分配更多的内存来保存每个字符串,所以我能想到的唯一解决方案是将每个单词放在tempString中,测量它的长度,然后分配足够的内存来保存它并移动到下一个单词。我的困惑是为什么每次迭代都会改变数组中的每个单词。我希望最后一行是五四四。将文件中的字符串分配给字符串数组遇到困难

我也认为我的方法是马虎,因为具有比tempString的长度更长的字符串会导致一个问题,但我无法想出解决方案。

这是我的代码。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* 
* 
*/ 

char** readWords(int* nPtr); 

int main() { 
    int numWords = 0; 

    readWords(&numWords); 

    return 0; 
} 



char** readWords(int* nPtr){ 
    int i = 0; 
    int listIndex = 0; 
    char tempChar = 0; 
    char** stringArray = NULL; 
    char tempString[50] = {}; 

    FILE *inputfile=fopen("inputfile.txt","r"); 
    fscanf(inputfile,"%d\n",nPtr); //Makes numWords = integer on first line 

    stringArray = calloc(*nPtr, sizeof(char*)); 

    for(i=0;i<*nPtr;i++){ 
     fscanf(inputfile,"%s", tempString); 
     stringArray[*nPtr-1-i] = calloc(strlen(tempString)+1, sizeof(char)); 
     stringArray[*nPtr-1-i] = tempString; 
     printf("tempString: %s\n",tempString); 
     printf("stringArray index: %d\n",*nPtr-1-i); 
     printf("stringArray: %s%s%s%s%s\n",stringArray[0],stringArray[1],stringArray[2],stringArray[3],stringArray[4]); 
    } 


    fclose(inputfile); 

} 

这是我的输出

tempString: one 
stringArray index: 4 
stringArray: (null)(null)(null)(null)one 
tempString: two 
stringArray index: 3 
stringArray: (null)(null)(null)twotwo 
tempString: three 
stringArray index: 2 
stringArray: (null)(null)threethreethree 
tempString: four 
stringArray index: 1 
stringArray: (null)fourfourfourfour 
tempString: five 
stringArray index: 0 
stringArray: fivefivefivefivefive 

RUN SUCCESSFUL (total time: 64ms) 

这是我的输入文件

5 
one 
two 
three 
four 
five 

建议是非常赞赏

+0

您忘记将临时字符串复制到您为数组分配的空间中。 – michaelmeyer 2014-10-11 04:54:53

+0

这段代码有许多错误。最可怕的是你每次看到'ptr = some-allocation-function(...);'后面跟着'ptr =别的东西;'你只是(a)复制一个地址;不是一块内存,和(b)在两条短行内泄漏内存(只比记录多一个内存;一个没有分配的空白'malloc')。快速修复是一个'strcpy'而不是一个任务,但是这个代码真的需要更多的帮助。 – WhozCraig 2014-10-11 05:03:02

+0

谢谢,我用strcpy,它现在可以工作。我没有完全想到字符串是c中的指针而不是数据类型。你介意在我的代码中列出其他一些错误的东西吗? (b)我不知道你的意思。不calloc初始化内存为空?你没有分配什么意思。我对动态内存分配很陌生。 – Esoremada 2014-10-11 05:24:31

回答

1

有效的所有数组元素被分配tempString值,所以他们都指向同样的地方持有人,因此最终他们都指向th将最后一个值存储到tempString中。修复方法是将tempString的内容复制到相应数组元素的已分配占位符中:

strcpy(stringArray[*nPtr-1-i], tempString); 
+0

清楚的解释,谢谢 – Esoremada 2014-10-11 05:18:17

+0

@ user3620725:如果Ron的回答充分回答了您的问题,接受答案通常是一个好主意。更多关于接受答案可以在这里找到(http://meta.stackexchange.com/a/5235/271768) – 2014-10-11 06:58:01

+0

@ user3620725 - 虽然'fscanf'没有错,你可能会发现'getline'是优越的对于行输入,由于它返回读取的字符数**和**当'** lineptr'设置为'NULL'时能够根据需要动态分配内存。看到'男人getline' - 绝对值得一看。 – 2014-10-11 08:56:41

相关问题