【问题标题】:Scan a line with spaces and symbols to separate the entries and using structures in C用空格和符号扫描一行以分隔条目并使用 C 中的结构
【发布时间】:2021-04-04 12:55:21
【问题描述】:

所以这段代码的目的是扫描一个类似这样的句子:

在我家#House#28#-134.943|47.293#21-24

代码必须扫描由“#”分隔的 6 个不同部分。第一个“在我家”是聚会的地点,第二个“房子”是聚会的地点类型,第三个“28”是到达那里的步行时间,第四个“-134.943|47.293”是用“|”分隔的经纬度(查找地点),最后,“21-24”是聚会开始和结束的时间。前面的所有参数都必须保存在不同的变量中,这些变量的结构如下所示:

typedef struct {
    
    char name[MAX];                     //name of the location
    char location_type[MAX];            //type of location
    int travel;                         //time to arrive
    int latitude;                   
    int longitude;                  
    int hours[5];                       //when the party starts and ends
    
} Locations;

然后,为每个聚会地点整齐地存储所有内容。

所以,我要求一个函数来询问和存储我们之前看到的结构中的所有信息(由“#”和“|”分隔)。这个函数是这样的:

int AddLocation(Locations location[]) {
    
    int i = 0;
    
    i = num_locations;
    
    printf ("Location information: ");
    
    // here should be the scanf and this stuff
        
    i++;
    
    return i;
}

【问题讨论】:

  • 通过fgets()读取行,通过strtok()拆分并解析每个部分。

标签: c string data-structures scanf separator


【解决方案1】:

对格式进行一些更改(即,lat/long 需要是浮点数,我不确定您对 hours 的 int 数组的用途是什么),您可以执行以下操作:

#include <stdio.h>

#define MAX 32

struct loc {
        char name[MAX];
        char location_type[MAX];
        int travel;
        float latitude;
        float longitude;
        char hours[MAX];
};

int
main(void)
{
        struct loc Locations[16];
        struct loc *t = Locations;
        struct loc *e = Locations + sizeof Locations / sizeof *Locations;
        char nl;
        char fmt[128];

        /* Construct fmt string like: %31[^#]#%31[^#]#%d#%f|%f#%31[^\n]%c */
        snprintf(fmt, sizeof fmt,
                "%%%1$d[^#]#%%%1$d[^#]#%%d#%%f|%%f#%%%1$d[^\n]%%c", MAX - 1);
        while( t < e
                && 7 == scanf(fmt,
                        t->name, t->location_type, &t->travel,
                        &t->latitude, &t->longitude, t->hours, &nl
                ) && nl == '\n'
        ) {
                t += 1;
        }
        for( e = Locations; e < t; e++ ){
                ; /* Do something with a location */
        }
}

【讨论】:

    【解决方案2】:

    尝试编译并运行它。此代码应拆分您的字符串。您所要做的就是将结果正确地输入到您的结构中。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(){
        /*Declare variable */
        char *line = malloc(250 * sizeof(char *));
        size_t line_size = 250;
        char *argument = malloc(250 *sizeof(char *));
    
        /*Get string and save it in line */
        getline(&line,&line_size,stdin);
    
        /*Split string */
        char corrector[] = "#|\n";
        argument = strtok(line,corrector);
        while(argument != NULL){
                printf("%s\n", argument);
                argument = strtok(NULL,corrector);
        }
        return 0;
    }
    

    输入:在我家#House#28#-134.943|47.293#21-24

    Output:
          In my house
          House
          28
          -134.943
          47.293
          21-24
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多