3

指定されたファイル (辞書) から単一の文字列に単語を読み取り、その文字列を文字列配列の n 番目のインデックスに割り当てます。しかし、うまくいきません。main()is always e3V\347etc. の for ループの出力と、常にcreateWordTable()辞書の最後の単語である for ループの出力。これが私のコードです

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 の文字列の配列でポインターが機能しないのはなぜですか (角かっこも「ポインター」を意味することはわかっています)。整数配列で悪い経験がないからです。下手な英語で申し訳ありませんが、ここに新しいコードがあります:`

char ワード[338][10];

int main()

{

createWordTable();

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


return 0;

}

ボイド createWordTable(){

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

createTable() の結果が失われています。別々のポインター変数に保管してください。

hashTable = createTable();
hashTable = createWordTable();
于 2013-11-10T10:27:17.273 に答える
1

関数から文字列の配列を返すオプションは、二重NUL終了文字列を使用することです。

このデータ構造は文字列のシーケンスであり、1 つずつメモリに格納され、それぞれNULが - で終了し、最後に - ターミネータが追加 NULされています。たとえば、次のようになります。

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

関数から、最初の文字列、つまりシーケンスの先頭へのポインターを返すことができます。

このデータ構造の大きな利点の 1 つは、配列内の文字列の局所性が非常に優れていることです。

次のソース コードからわかるように、このデータ構造の実装は難しくなく、ナビゲートも簡単です。

#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 に答える
0

fscanfに直接table[wordcount]またはstrcpyから直接する必要がありwordます。それ以外の場合、すべてのエントリは、ファイル内の最後の文字列を含む word を指すだけです。

于 2013-11-10T10:30:13.967 に答える