【问题标题】:Scanning a list of words into slots in an array将单词列表扫描到数组中的槽中
【发布时间】:2015-09-10 00:10:42
【问题描述】:

因此,我尝试从文本文件中扫描大量单词,并以允许从单个数组访问它们的方式存储它们。

149256
aahing
aahs
aals
aardvark
aardvarks
aardwolf
aardwolves
aargh
aarrgh
aarrghh

我正在从上述格式的文本文件中扫描这些单词。该数字是列表中存在的单词总数(它是一本字典,解释了高字数),并且单词一次跟随一行。我希望能够从动态分配的数组中访问每个单词,即 word[0] 将包含“aahing”。现在我知道一个简单的 char 数组无法做到这一点。我首先尝试在下面的代码中使用多维数组来完成此操作:

main(){
int numWords,i;

FILE * fp= fopen("dictionary.txt","r");

fscanf(fp,"%d", &numWords);

char* array = malloc(numWords * 20 * sizeof(char)); //word length is always below 20

   for(i = 0; i < numWords; i++){

         fscanf(fp, "%s", &array[i]);
         //printf("%s \n",&array[i]); used to check the scan
   }

printf("%s \n",&array[0]);
}

*我的理解不应该需要数组的 & infront,但是当这些不存在时程序会崩溃,这可能是我的代码有问题。

现在,当删除最后的 printf 语句并取消循环中的 printf 注释时,程序似乎可以正常工作。但是,如果添加最后一个 printf,程序会打印扫描的每个单词的第一个字母以及最后一个单词的全部内容。据我了解,这是不可能的,因为每个新单词都应该被扫描到数组的不同行中,但显然情况并非如此。在这种情况下,我会更好地以某种方式分配数组的每个插槽以指向每个插槽中的新数组吗?即 array[1] -> data[] , array[2] -> data[] 每个都包含一个新单词。 非常感谢您指出正确的方向。

【问题讨论】:

    标签: c arrays malloc


    【解决方案1】:

    它打印每个单词的第一个字母,因为您在每个循环中只推进一个索引。如果将 foo 添加到地址数组 [0],下一个单词应该从数组 [3] 开始,所以你要做的就是代替 &array[i],计算已经写入的字符数并添加到那个索引,像这样:

    int chars_written = 0;
    for(i = 0; i < numWords; i++){
             fscanf(fp, "%s", &array[chars_written]);
             //printf("%s \n",&array[chars_written]); used to check the scan
             chars_written += strlen(&array[chars_written])
    }
    

    但是,如果你想要一个字符串数组,其中每个索引都是一个字符串,你需要一个不同的文件类型:

    char **数组;

    由于字符串是一个字符数组,所以你需要一个字符数组。

    然后你需要分配它并像这样使用它:

    char **array;
    array = malloc(sizeof(char*) * (numWords + 1))
    for (int i = 0, i < numWords; i++)
        array[i] = malloc(sizeof(char) * 20); // assuming every word is under 19 chars (you used 20 in your code, thats why i used it)
    array[numWords] = NULL;
    for(i = 0; i < numWords; i++){
        fscanf(fp, "%s", array[i]);
        //printf("%s \n",array[i]); used to check the scan
    }
    

    【讨论】:

    • 啊,这很有道理。
    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2019-07-25
    • 2013-02-27
    • 2016-07-29
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多