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 ); |
注意:我知道我只得到一个角色。
- 在您提交的代码中,没有任何内容可以转换,即使meridiem名称在您的描述中应该是两个字符的单词,也只有第一个字符会被扫描。而且,scanf_s()甚至不属于C标准,它是微软的扩展。
- 如果在您的平台上可用,您可以查看strptime()/strftime()(pubs.opengroup.org/onlinepubs/9699919799/functions/…/pubs.opengroup.org/onlinepubs/9699919799/functions/…)
- 另外请注意,char meridiem;只存储一个字符。
- 相关(尽管不是重复的):将12小时日期/时间转换为24小时日期/时间。
- 注意,在ISO/IEC 9899:2011-C11标准的附录K中规定了(scanf_s()的变体)。区别主要在于缓冲区长度参数的类型——ms中的unsigned和标准c中的rsize_t。另请参见是否使用tr-24731"safe"函数?
处理用户输入最好分两步进行:输入、解析。然后处理数据。
步骤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;
} |
- 这将很高兴地接受"上午13点44分",而"下午1点23分"将失败。
- @Angstrom,您必须输入12小时格式为hh:mm:ssam或hh:mm:sspm谢谢