将文本文件中的单词读入2d数组的问题

时间:2011-11-17 18:03:51

标签: c arrays string

我最近开始了一个程序,我必须对其中的客人列表进行排序,但总体问题的详细信息对于我遇到的问题是不敬的。

好吧,我想从SEPARATELY文件中扫描名字和姓氏,我知道你将它们扫描为字符串。然而,我们刚刚开始使用字符串,我有一点脑屁,我搜索过的地方,但我无法弄清楚如何这样做。我也在构造for循环中的数组时遇到了麻烦。自“天际”出来后,我的思绪完全失控了:)。这是输入文本文件:

//First number is the amount of families on the list, second number is the room capacity, ignore that for now.

10 30 

//Format = First Name, Last Name, Number of Family Members (ignore), Priority Level (ignore)

BEN JOHNSON 4 2 

DOUG ESPINOSA 3 2

SARAH TELLINGER 5 3

GRANT THOMPSON 5 2

JENNIFER WEST 7 6

JACKSON JOHNSON 1 5

MARTY MCFLY 4 1

ELIZABETH JAMES 2 6

MICKEY MOUSE 2 4

RAJ SHAH 2 5

到目前为止,这是我的代码:假设MAX_FAMILY_MEMBERS = 10且MAX_NAME_LENGTH = 20

void Read_First_Name(FILE *ifp, char First_Name[//Assume MAX_FAMILY_MEMBERS is here][MAX_NAME_LENGTH]){

int i, j;

for(i = 0; i < MAX_FAMILY_MEMBERS; i++) 
{
    for(j = 0; j < MAX_NAME_LENGTH; i++) 
    {
        fscanf("%s", First_Name[i][j]);
    }
}}

我确信这很可能是错的,但是我很困惑并且没有。如果对我的计划有任何疑问,请询问。

3 个答案:

答案 0 :(得分:0)

如果你在一个循环中使用带有sscanf的fgets就很容易了,比如

char line[100], firstnames[100][100], famnames[100][100];
int counter=0;

while( fgets(line,100,yourfilepointer) )
  if( sscanf(line,"%s%s",firstnames[counter],famnames[counter])==2 )
    ++counter;
...
while( counter-- )
  printf("%s %s\n",firstnames[counter],famnames[counter]);

答案 1 :(得分:0)

我假设你想根据他们的优先级对家庭进行排序。在您编写的代码中,

您的fscanf语法不正确。再次阅读语法。

    for(i = 0; i < MAX_FAMILY_MEMBERS; i++) 
    {
    for(j = 0; j < MAX_NAME_LENGTH; i++) 
    {
    fscanf("%s", First_Name[i][j]);
    }
    }

你想逐行阅读(按家庭分列)是好的,但你如何阅读每个家庭是不合适的。

%s格式说明符读取整个字符串,直到遇到空格。 所以第二个for循环非常混乱。

我会略微改变代码,你可以改进它并编写自己的逻辑

    #define NUMBEROFFAMILIES 10
    #define FAMILYNAMELENGTH 20

    char firstName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store first name 
    char secondName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store second name
    int familtyPriority[NUMBEROFFAMILIES][1]; // to store priority

    int i, j;

    for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
        fscanf(ifp,"%s",firstName[NUMBEROFFAMILIES]); // read first name
        fscanf(ifp,"%s",secondName[NUMBEROFFAMILIES]); // read second name
        fscanf(ifp,"%d", &j); // Ignore family members count
        fscanf(ifp,"%d", &familtyPriority[NUMBEROFFAMILIES][1]); // family priority
   }

编辑下一个问题

您希望根据优先级进行排序。

       int familtyPriorityCopy[NUMBEROFFAMILIES][1]; // to store priority
       int familyOrder[NUMBEROFFAMILIES][1]; // to store the proper order.
       // initialize them
       for (i=0;i<NUMBEROFFAMILIES;i++){
          familtyPriorityCopy[i][1] = familtyPriority[i][1];
          familyOrder[i][1] = i;
       }
       // sorting [insertion sort]           
       for (i=1;i<NUMBEROFFAMILIES;i++){
         for (j=0;j<i;j++){
           if (familtyPriorityCopy[j][1] < familtyPriorityCopy[i][1]){
              swap(familtyPriorityCopy[i][1],familtyPriorityCopy[j][1]);
              swap(familyOrder[i][1], familyOrder[j][1]);
           }
         }
       }

最后,对familtyPriorityCopy数组进行排序。但这不重要。 familyOrder数组指向正确的顺序。我们将使用此数组以正确的顺序打印它们。

   for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
        printf("%s",firstName[familyOrder[i][1]][1]); // read first name
        printf("%s",secondName[familyOrder[i][1]][1]); // read second name
        printf("%d", familtyPriority[familyOrder[i][1]][1]); // family priority
   }

答案 2 :(得分:0)

void Read_And_Store(FILE *ifp, int FAMILIES_KNOWN, char First_Name[][MAX_NAME_LENGTH], char Last_Name[][MAX_NAME_LENGTH], int Family_Members[], int Priority[]){
int i;

for(i = 0; i < FAMILIES_KNOWN - 1; i++)
{
    fscanf(ifp, "%s", First_Name[i]);
    fscanf(ifp, "%s", Last_Name[i]);
    fscanf(ifp, "%d", &Family_Members[i]);
    fscanf(ifp, "%d", &Priority[i]);
}}

这是我做的,当我打印出来时它工作正常。但是,我尝试了一些尝试按优先级对打印列表进行排序的东西,但没有一个是成功的...任何想法?在我完成排序后,剩下的只是基本的逻辑和交换。