【问题标题】:Having trouble assigning strings from a file to an array of string将文件中的字符串分配给字符串数组时遇到问题
【发布时间】:2014-10-11 04:47:46
【问题描述】:

任务是从一个文本文件中读取单词,然后将它们反向打印到另一个文本文件中。我无法将读到的单词放入数组中。我不应该分配比保存每个字符串所需的更多内存,所以我能想到的唯一解决方案是将每个单词放在 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

非常感谢您的建议

【问题讨论】:

  • 您忘记将临时字符串复制到您在数组中为其分配的空间中。
  • 这段代码有很多问题。最可怕的是任何时候你看到ptr = some-allocation-function(...);,然后是ptr = something else;,你只是(a)复制了一个地址;不是内存块,并且 (b) 在两行短行中泄漏了内存(仅比记录多一行;没有分配的裸 malloc)。快速修复是 strcpy 而不是分配,但老实说,这段代码需要更多的帮助。
  • 谢谢,我使用了 strcpy,现在可以使用了。我并没有完全想到字符串是 c 中的指针而不是数据类型。您介意在我的代码中列出一些其他错误吗?我不知道你所说的(b)是什么意思。 calloc 不会将内存初始化为空吗?没有任务是什么意思。我对动态内存分配很陌生。
  • 几乎没有花太多时间仔细观察,但something like this。请注意数组与其长度在结构中的耦合,以保持相关的事物紧密。那里还有其他主题,指针数组的动态扩展等。我在 BSD 字典文件(230K+ 字)上放松了它,它毫不费力地通过了它,所以希望它有所帮助。祝你好运。
  • ty,这很有帮助

标签: c arrays string file memory


【解决方案1】:

实际上,所有数组元素都被分配了 tempString 值,因此它们都指向相同的占位符,因此最后它们都指向存储到 tempString 中的 LAST 值。修复方法是将 tempString 的内容复制到相应数组元素的已分配占位符中:

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

【讨论】:

  • @user3620725 :如果 Ron 的回答充分回答了您的问题,那么接受答案通常是个好主意。更多关于接受答案可以找到here
  • @user3620725 - 虽然fscanf 没有任何问题,但您可能会发现getline 更适合行输入,因为它返回读取的字符数**lineptr 设置为NULL 时,能够根据需要动态分配内存。见man getline——绝对值得一看。
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2014-06-08
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多