2014-03-03 102 views
1

我只是自己做一些额外的工作,试图更好地掌握C中的多维字符串数组,例如数组[3] [5] = {“apple”, “房子”, “卡车”}。我有一个测试文件,里面填充了很多不同长度的单词,并且想用这些不同的单词填充字符串数组。我使用动态分配来提供内存空间,打开文件以及使用fgets来获取每个单词,因为每个单词都在一个新的行中。我将这个单词保存到数组中的新位置,然后打印它以检查它是否已保存。他们应该打印字样,这让我相信他们正在被储存,但是然后我得到了一个seg故障。任何人都可以向我解释为什么发生这种情况?C多维字符串数组在C

文本文件和形式I具有它的样品中是(无字之间的空行:

魅力

女巫

附魔

滥用

Mitch

Mitc地狱

斜切

减轻

减轻

减轻

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

#define WORDS 50 
#define LETTERS 15 

int main(int argc, char *argv[]) { 

int i; 
char **array; 
FILE *file1; 
char string[15]; 

array=(char **)malloc(LETTERS*sizeof(char*)); 

for (i=0;i<WORDS;i++) { 
    array[i]=(char *)malloc(LETTERS*sizeof(char)); 
} 

if (argc != 2) { 
    printf("\nERROR: Wrong number of arguments entered\n"); 
    return -1; 
} 

file1=fopen(argv[1],"r"); 

if (file1==NULL) { 

    printf("\nERROR: File 1 not found\n"); 
    return -1; 
} 

for (i=0;i<=WORDS;i++) { 
    fgets(string,LETTERS,file1); 
    array[i][0]=*string; 
    printf("%s",string); 
} 

return 0; 

} 
+1

'阵列[I] [0] = *串;''到的strcpy(阵列[I]中,字符串);'。 – chux

+0

仅供参考 - [我投出malloc的结果吗?](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – crashmstr

回答

0

从你的榜样,您需要分配至少6个字符为每个字符串,否则你会丢弃终端空字符。

0

动态内存分配在你的代码中是错误的。

,而不是这个代码array=(char **)malloc(LETTERS*sizeof(char*));替换下面的代码

array=(char **)malloc(WORDS*sizeof(char *)); 
for(i=0;i<WORDS;i++) 
array[i]=(char *)malloc(LETTERS*sizeof(char)); 

从文件还需要修改读取数据。

,而不是这个代码for (i=0;i<=WORDS;i++) { fgets(string,LETTERS,file1); array[i][0]=*string; printf("%s",string); }

替换下面的代码

i=0; 
while(fgets(string,LETTERS,file1)!=NULL){ 
strcpy(array[i],string); 
printf("%s",string); 
i++; 
} 

现在i共持有字符串从文件中读取的值。 有关打印阵列的内容

int j; 
for(j=0;j<i;j++) 
printf("%s",array[j]); 
+0

不要投出malloc的结果 – zoska