微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

扫描带有空格和符号的行以分隔条目并使用 C 中的结构

如何解决扫描带有空格和符号的行以分隔条目并使用 C 中的结构

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

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

代码必须扫描以“#”分隔的 6 个不同部分。第一个,“In my house”是聚会的地点,第二个“House”是聚会地点的类型,第三个“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;
}

解决方法

对格式进行一些更改(即,纬度/经度需要是浮点数,我不确定您打算对 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 */
        }
}
,

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

#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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。