关于C#:从用户那里获取12小时格式的时间并转换为24小时格式


Getting time in 12-hour format from the user and convert to 24-hour format

在K.N.King's Book C Programming:A Modern Approach,Chapter 7中有一个练习9(也是练习8),它要求用户输入12小时的时间,然后将其转换为24小时的时间。

例如,晚上9:11->21:11

对于我的问题,我理解如何以8:37pm或8:37[空格]pm的格式获取时间,但我不知道如何使其适用于这两种格式。

谢谢

1
2
3
4
5
6
7
8
int h, m;
char meridiem;

printf("Enter a 12-hour time:");
scanf_s("%d:%d%c", &h, &m, &meridiem);

printf("%c
"
, meridiem);

注意:我知道我只得到一个角色。


处理用户输入最好分两步进行:输入、解析。然后处理数据。

步骤1:简单读取用户输入

1
2
3
4
5
printf("Enter a 12-hour time:");
fflush(stdout);  // Insure output is completely sent

char buf[80];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle__InputClosed();

步骤2:分析输入。很多方法。这个函数使用"%n"来检测成功解析的输入的结束。"%n"用于保存扫描的当前偏移量。"%d %1[aApP]"中的空间允许在分钟和AM/PM之间的用户输入上可选出现空间。

1
2
3
4
5
6
7
8
int hour, minute;
char meridian[2];
int n = 0;
sscanf(buf,"%d:%d %1[aApP]%*[mM] %n", &hour, &minute, meridian, &n);
if (n == 0 || buf[n] || hour < 0 || minute < 0 || hour >= 12 || minute >= 60) {
  puts("Bad input");
  return -1;
}

步骤3:处理已验证的输入

1
2
3
4
5
6
7
8
meridian[0] = toupper(meridian[0]);
if (meridian[0] == 'A') {
  if (hour >= 12) hour -= 12;  // 12:00 AM --> 0:00
} else {
  hour += 12;
}
printf("%d:%02d
"
, hour, minute);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>

int main(){
    char time[10];
    int hour,minute,second;

    gets(time);

        hour=(time[0]-'0')*10+(time[1]-'0');
        minute=(time[3]-'0')*10+(time[4]-'0');
        second=(time[6]-'0')*10+(time[7]-'0');
        if(hour==12&&time[8]=='A')
            printf("%02d:%02d:%02d
"
,hour-12,minute,second);
        else if(hour==12&&time[8]=='P')
            printf("%02d:%02d:%02d
"
,hour,minute,second);
        else if(hour<12&&time[8]=='A')
            printf("%02d:%02d:%02d
"
,hour,minute,second);
        if(hour<12&&time[8]=='P')
            printf("%02d:%02d:%02d
"
,hour+12,minute,second);

    return 0;
}