分配是从文本文件中读取单词,然后将它们反向打印到另一个文本文件。我把把我读到的单词放到数组中时遇到了麻烦。我不应该分配任何超过必要的内存来保存每个字符串,所以我能想到的唯一解决方案是将每个单词放在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 :(得分:1)
实际上,所有数组元素都被赋予tempString值,因此它们都指向SAME占位符,因此最后它们都指向存储在tempString中的最后一个值。修复方法是将tempString的内容复制到相应数组元素的已分配占位符中:
strcpy( stringArray[*nPtr-1-i], tempString );