将单词列表扫描到数组中的槽中
Scanning a list of words into slots in an array
因此,我尝试从文本文件中扫描大量单词并以允许从单个数组访问它们的方式存储它们。
149256
aahing
aahs
aals
aardvark
aardvarks
aardwolf
aardwolves
aargh
aarrgh
aarrghh
我正在从上述格式的文本文件中扫描这些词。该数字是列表中出现的单词总数(这是一本字典,解释了高单词数),并且单词一次排成一行。我希望能够从动态分配的数组中访问每个单独的单词,即单词 [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 **数组;
由于字符串是一个字符数组,因此您需要一个字符数组的数组。
然后你需要像这样分配和使用它:
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
}
因此,我尝试从文本文件中扫描大量单词并以允许从单个数组访问它们的方式存储它们。
149256
aahing
aahs
aals
aardvark
aardvarks
aardwolf
aardwolves
aargh
aarrgh
aarrghh
我正在从上述格式的文本文件中扫描这些词。该数字是列表中出现的单词总数(这是一本字典,解释了高单词数),并且单词一次排成一行。我希望能够从动态分配的数组中访问每个单独的单词,即单词 [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 **数组;
由于字符串是一个字符数组,因此您需要一个字符数组的数组。
然后你需要像这样分配和使用它:
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
}