我如何扫描时间?

时间:2012-03-17 18:37:51

标签: c

我很难用sscanf从列表中扫描小时和分钟。下面是列表的一小部分。

1704 86 2:30p 5:50p Daily
1711 17 10:40a 2:15p 5
1712 86 3:10p 6:30p 1
1731 48 6:25a 9:30a 156
1732 100 10:15a 1:30p Daily
1733 6 2:15p 3:39p Daily

我已经尝试了这个,但它一直让我分段错误。(我将这些信息放入结构中)。

 for(i=0;i<check_enter;i++){
    sscanf(all_flights[i],
    "%d %d %d:%d%c %d:%d%c %s",
    &all_flights_divid[1].flight_number,
    &all_flights_divid[i].route_id,
    &all_flights_divid[i].departure_time_hour,
    &all_flights_divid[i].departure_time_minute,
    &all_flights_divid[i].departure_time_format,
    &all_flights_divid[i].arrival_time_minute,
    &all_flights_divid[i].arrival_time_minute,
    &all_flights_divid[i].arrival_time_format,
    &all_flights_divid[i].frequency);

    printf("%d ",all_flights_divid[i].flight_number);
    printf("%d ",all_flights_divid[i].route_id);
    printf("%d ",all_flights_divid[i].departure_time_hour);
    printf("%d ",all_flights_divid[i].departure_time_minute);
    printf("%c ",all_flights_divid[i].departure_time_format);
    printf("%d ",all_flights_divid[i].arrival_time_hour);
    printf("%d ",all_flights_divid[i].arrival_time_minute);
    printf("%c ",all_flights_divid[i].arrival_time_format);
    printf("%s\n",all_flights_divid[i].frequency);
  }

这是我宣布它的方式。

struct all_flights{
  int flight_number;
  int route_id;
  int departure_time_hour;
  int departure_time_minute;
  char departure_time_format;
  int arrival_time_hour;
  int arrival_time_minute;
  char arrival_time_format;
  char frequency[10];
};
struct all_flights all_flights_divid[3000];

这些是我得到的结果

0 86 2 30 p 0 50 p Daily
0 17 10 40 a 0 15 p 5
0 86 3 10 p 0 30 p 1
0 48 6 25 a 0 30 a 156
0 100 10 15 a 0 30 p Daily
0 6 2 15 p 0 39 p Daily

2 个答案:

答案 0 :(得分:2)

仔细查看sscanf中的输出目标列表。您是否看到&all_flights_divid[i].departure_time_minuteall_flights_divid[i].departure_time_format之间的区别?类似于.arrival_time_format.frequency

你觉得&amp; &符号用于?提示:什么是从单个函数调用返回多个值的一种方法,这与&amp; amp;符号

当程序尝试将数据写入内存时,操作系统从未指示CPU使程序可用,就会出现分段错误。当数据放错位置时,并不总是会发生分段错误,因为有时数据会在可用内存中错误放置。通过类比的方式,如果你无意中将一本书放在书架上的错误位置,你以后就不会轻易找到这本书,但这本书仍然放在书架上,似乎没有人不合适。另一方面,如果你无意中把同一本书放在冰箱里,那么,当母亲去买牛奶时,她会给你一个分段错误!无论如何,这就是类比。

一般情况下,在运行程序之前,很难猜测错位数据是否会导致分段错误(错误地放入冰箱)(在书架上放错位置)。分段故障(冰箱)是优选的,因为它使错误显而易见,因此操作系统试图通过尽可能少地提供程序来尽可能多地给出分段错误。

由于你的“家庭作业”标签,我避免直接​​回答100%。看看你能否弄清楚&amp;如果它仍然没有意义,那么就会回到这里。

答案 1 :(得分:0)

你的指针都搞砸了。也许一系列专门用于阅读这些内容的局部变量可以帮助您将这一切组织起来。

int flightNum, routeID, depHour, depMin, arrHour, arrMin;
char depFormat, arrFormat;
char * freq;
for(i=0;i<check_enter;i++){
    sscanf(
        all_flights[i],"%d %d %d:%d%c %d:%d%c %s"
        &flightNum, &routeID,
        &depHour, &depMin, &depFormat,
        &arrHour, $arrMin, $arrFormat,
        freq
    );

    all_flights_divid[i].flight_number = flightNum;
    all_flights_divid[i].route_id = routeID;
    all_flights_divid[i].departure_time_hour = depHour;
    all_flights_divid[i].departure_time_minute = depMin;
    all_flights_divid[i].departure_time_format = depFormat;
    all_flights_divid[i].arrival_time_hour = arrHour;
    all_flights_divid[i].arrival_time_minute = arrMin;
    all_flights_divid[i].arrival_time_format = arrFormat;
    strcpy(all_flights_divid[i].frequency, freq);
}