c - 将单词列表扫描到数组中的槽中

标签 c arrays malloc

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

149256
aahing
aahs
aals
aardvark
aardvarks
aardwolf
aardwolves
aargh
aarrgh
aarrghh

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

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

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

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

最佳答案

它打印每个单词的第一个字母,因为每个循环只推进一个索引。如果将 foo 添加到地址 array[0],则下一个单词应从 array[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 **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
}

关于c - 将单词列表扫描到数组中的槽中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32491044/

相关文章:

c - Silabs Clockbuilder C头文件使用

python - 导入错误 : Cython and gcc-5

python - OpenCV - 对于 cv2.imread,numpy 数组是 'bad argument type'?

c - 将 free() 与通过函数接收地址的指针一起使用

c - module_init 没有显示我想要的 printk

c - 将txt文件逐行读入char数组C

c++ - 我不明白为什么我生成的随机数没有正确存储

java:检查数组[i][j]是否在范围内

c - malloc 只分配内存,不分配其他东西吗?

C - 结构数组,free 问题,在我的结构数组中赋值的问题