将多行扫描到C中的结构数组中

时间:2017-05-15 03:21:36

标签: c arrays struct scanf

我希望编写一个可以在以下格式的文本文件上实现的代码:

(#)string
int int int

例如:

#wisconsin
20 45 00
#zelda
13 45 20

如何将其扫描到以下结构的数组中:

typedef struct{
    char string[99];
    int  first_int;
    int  second_int;
    int  third_int;
} input_t;

我目前的想法是:

input_t mydata[MAX_NAMES];
int count = 0;
while(mydata[count] = scanf("%s %d %d %d", input_t.string, 
    input_t.first_int, input_t.second_int, input_t.third_int,)){
        count++;
}

但这不起作用,我不确定如何使用哈希来识别数据的开头而不将其实际包含在字符串中。

1 个答案:

答案 0 :(得分:1)

这大致是我要做的事情:

#include <stdio.h>

typedef struct{
    char string[99];
    int  first_int;
    int  second_int;
    int  third_int;
} input_t;

enum { MAX_NAMES = 20 };

int main(void)
{
    input_t mydata[MAX_NAMES];
    int i;
    for (i = 0; i < MAX_NAMES; i++)
    {
        if (scanf(" #%s %d %d %d", mydata[i].string, &mydata[i].first_int,
                  &mydata[i].second_int, &mydata[i].third_int) != 4)
            break;
    }
    int count = i;

    for (i = 0; i <  count; i++)
        printf("%s (%d, %d, %d)\n", mydata[i].string, mydata[i].first_int,
                  mydata[i].second_int, mydata[i].third_int);
    return 0;
}

输入文件:

#wisconsin
20 45 00
#zelda
13 45 20

显示的代码产生输出:

wisconsin (20, 45, 0)
zelda (13, 45, 20)

格式字符串中的前导空格是必要的,以便在读取三个整数后跳过留下的换行符。