从C中的函数返回字符串数组

我从给定的文件(字典)读取单个字符串的单词,并将字符串分配给字符串数组的第n个索引。 但它不起作用。 main() for循环的输出始终为e3V\347等,而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; } 

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

char words [338] [10];

int main()

{

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

}

void 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); 

}`

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

 hashTable = createTable(); hashTable = createWordTable(); 

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

这个数据结构是一个字符串序列,一个存储在另一个存储器中,每个NUL终止,并在末尾有一个额外的 NUL -terminator,例如:

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

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

这种数据结构的一大优势是它对arrays中的字符串具有非常好的局部性

这个数据结构并不难实现,并且易于导航 ,您可以从以下源代码中看到:

 #include  #include  #include  #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; } 

你应该fscanf直接进入table[wordcount]strcpyword 。 否则,每个条目都只指向word,其中包含文件中的最后一个字符串。