3

我从给定文件(字典)中读取单词到单个字符串,并将字符串分配给字符串数组的第 n 个索引。但它不起作用。中 for 循环的输出main()总是e3V\347等等,而 for 循环中的输出createWordTable()总是字典的最后一个单词。这是我的代码

char** createWordTable();

char** createTable();

int main()
{

    int i;
    char **hashTable;
    hashTable = createTable();
    hashTable = createWordTable();



    for (i=0; i< 338; i++) {
        printf("%s \n",hashTable[i]);
    }

    return 0;
}

char** createWordTable(){

    char  word[20],**table;
    FILE *dicFile;
    table = createTable();

    dicFile = fopen("smallDictionary.txt", "r");
    if (dicFile == NULL) {
        perror("error");
    }
    int wordCount = 0,endFile = 1;
    while (endFile != EOF) {
        endFile = fscanf(dicFile,"%s",word);
        table[wordCount] = word;
        wordCount = wordCount+1;
    }
    for (int i=0; i< 338; i++) {
        printf("%s \n",table[i]);
    }
    return table;

}

char** createTable(){

    char **table;
    int i;
    table = (char **)malloc(338 * sizeof(char *));
    for (i=0; i<=338; i++) {
        *table = (char *)malloc(25 * sizeof(char));
    }
    return table;
}

我将代码更改为此及其工作!我定义了全局变量“表”并删除了指针(也是动态分配函数)。我很好奇为什么指针不适用于此代码的 C 中的字符串数组(我知道方括号也表示“指针”)?因为我对整数数组没有不好的经验。抱歉英语不好,这是新代码:`

字符词[338][10];

主函数()

{

createWordTable();

for (int i=0; i< 338; i++) {
    printf("%s \n",words[i]);
}


return 0;

}

无效创建字表(){

char  word[20];

FILE *dicFile;


dicFile = fopen("smallDictionary.txt", "r");
if (dicFile == NULL) {
    perror("error");
}
int wordCount = 0;
while (!feof(dicFile)) {
    fscanf(dicFile,"%s",word);
    if(feof(dicFile)) break; 
   strcpy(words[wordCount], word);

    wordCount = wordCount+1;
}

 fclose(dicFile);

}`

4

3 回答 3

1

从函数返回字符串数组的一个选项是使用NUL终止字符串

该数据结构是一个字符串序列,一个接一个地存储在内存中,每个 -NUL终止,并在末尾附加一个 - 终止符,例如: NUL

+---+---+---+---+---+-----+---+---+---+---+---+-----+-----+
| H | e | l | l | o | NUL | w | o | r | l | d | NUL | NUL |
+---+---+---+---+---+-----+---+---+---+---+---+-----+-----+
                                                 ^^^^^^
                                      Double-NUL at the end

您可以从函数返回指向第一个字符串的指针,即指向序列开头的指针。

这种数据结构的一大优点是它对数组中的字符串有很好的局部性

这种数据结构实现起来不难,导航也很方便,从下面的源码可以看出:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ARRAY_SIZE(a)   (sizeof(a) / sizeof(a[0]))

char * build_string_array(void) {
    const char * test_strings[] = {
        "Hello",
        "World",
        "Hi",
        "John",
        "Connie"
    };
    int i;
    char * p;
    char * string_array;
    int total_len;

    /* Calculate total length of strings */
    total_len = 0;
    for (i = 0; i < ARRAY_SIZE(test_strings); i++) {
        /* Update total length with current string. +1 for '\0' */
        total_len += strlen(test_strings[i]) + 1;
    }

    /* Consider double-NUL termination */
    total_len++;

    /* Allocate memory for the resulting string array */
    string_array = malloc(total_len);
    if (string_array == NULL)
        return NULL; /* error */

    /* Copy source strings to the destination string array memory */
    p = string_array;
    for (i = 0; i < ARRAY_SIZE(test_strings); i++) {
        strcpy(p, test_strings[i]);
        p += (strlen(p) + 1); /* +1 to skip terminating NUL */
    }

    /* Terminate with double-NUL */
    *p = '\0';

    /* Return the address of the string array to the caller */
    return string_array;
}

int main() {
    char * test_string_array;
    const char * p;

    /* Create the test string array */
    test_string_array = build_string_array();
    if (test_string_array == NULL) {
        printf("Error in creating array.\n");
        return 1;
    }

    /* Print string array content */
    for (p = test_string_array; *p != '\0'; p += (strlen(p) + 1)) {
        printf("%s\n", p);
    }

    /* Free array memory */
    free(test_string_array);

    /* All right */
    return 0;
}
于 2013-11-10T10:53:48.530 回答
1

您正在丢失 createTable() 结果。将其存储为单独的指针变量。

hashTable = createTable();
hashTable = createWordTable();
于 2013-11-10T10:27:17.273 回答
0

您应该fscanf直接进入table[wordcount]strcpyword. 否则,每个条目将只指向包含文件中最后一个字符串的单词。

于 2013-11-10T10:30:13.967 回答