2016-01-29 86 views
2

我遇到问题,不能告诉它是什么。从file.txt读取其输入的字符串数组C编程

struct arrayDB { 
char *user[MAX_SIZE]; 
char *pass[MAX_SIZE]; 
char db[10][2]; 
}; 

void readFile(char fileName[100]) 
{ 
    char* word ; 
    char line[90]; 
    FILE *passFile; 
    int rowC=0; 
    int chk=0; 

    passFile=fopen(fileName,"rt"); 
    while(fgets(line,90,passFile)!=NULL) 
    { 
     word=strtok(line," "); 
     rowC=rowC+1; 
     while(word!=NULL) 
     { 
      printf("Count=%i \n",rowC); 
      if(chk==0) 
      { 
       printf("word:%s\n",word); 
       DB.user[rowC]=word; 
       chk=1; 
      } 
      else 
      { 
       printf("word:%s\n",word); 
       DB.pass[rowC]=word; 

      } 
      printf("r=%s , c=%s\n",DB.user[rowC],DB.pass[rowC]); 
      word=strtok(NULL," "); 

     } 

     chk=0; 
    } 
    int i; 

    for(i=1; i<6;i++) 
    { 
     printf("- %s , %s \n",DB.user[i],DB.pass[i]); 
    } 

} 

,但我得到了所有的数组元素的输出是它是文件 中的最后一个字,你可以在PIC看到

enter image description here

感谢

相同的值
+1

放置截图而不是文本复制/粘贴真的更容易吗? –

+1

您显示的代码不是您运行该示例的代码。首先,在行DB.pass [rowC] = word;没有定义''DB'。 – ryyker

回答

1

您正在将每行读入相同的字符串line。然后,当您使用strtok()时,它将返回指向此字符串的指针,并将这些指针存储到DB中。因此,DB中的所有记录都指向line中的位置,每当您从文件中读取另一行时,这些位置都会被覆盖。当一切都完成后,line包含文件最后一行的内容,并且所有DB条目都指向该内容。

另一个问题是line是一个局部变量,当函数返回时指向它的指针变为无效。

要解决这两个问题,您需要复制字符串并将其存储在DB中。例如:

 DB.user[rowC]= strdup(word); 

这也意味着,当你与一个DB记录完成后,你需要调用free(DB.user[i])

+0

工作像魅力....谢谢你的人 –

1

几点建议:

首先,学会使用调试器。有free ones,找一本打开它,找到所有这些错误的(这就是我在这里做)

接下来,为你展现编译代码示例,结构定义需要支持你的代码(目前,DB没有被定义)

typedef struct 
{ 
    char *user[MAX_SIZE]; 
    char *pass[MAX_SIZE]; 
    char db[10][2]; 
}arrayDB; 

arrayDB DB;//define DB 

接下来,

您需要为您的字符串数组分配空间: 类似:

for(i=0;i<MAX_SIZE;i++) 
{ 
    DB.user[i] = malloc(100); 
    DB.pass[i] = malloc(100); 
} 

接下来,不要忘记完成使用时释放它们。

for(i=0;i<MAX_SIZE;i++) 
{ 
    free(DB.user[i]); 
    free(DB.pass[i]); 
} 

接下来,可以使用等于操作者未指定一个字符串:

DB.pass[rowC]=word; 

使用的strcpy(或一些其它字符串函数)代替:

strcpy(DB.pass[rowC],word); 

接着,将该行:

printf("r=%s , c=%s\n",DB.user[rowC],DB.pass[rowC]); 

被调用后con其中要么要么DB.user[rowC]DB.pass[rowC]将被写入,从来都没有。建议分割此printf语句以打印一个或另一个,并将其放入适当的条件分支中。

+1

谢谢你的所有提示。问题是我是java程序员。但我想用C编写套接字编程,而且C中的一切都不一样。再次感谢您。我会尽量做你的建议 –

+1

他*是*递增指数。你没看到'rowC = rowC + 1;'? – Barmar

+0

是的。看到最后一条评论之后,我会编辑最后一条评论。谢谢。 – ryyker

相关问题