一直在尝试在 c++ 中将 12 小时制格式转换为 24 小时制格式

Have been trying to convert 12-hour clock format into 24-hour clock format in c++

本文关键字:小时 格式 转换 c++ 中将 一直      更新时间:2023-10-16

输入格式为:hh:mm:ssAM 或 hh:mm:ssPM

例:

输入:下午07:05:45

输出: 19:05:45

#include <bits/stdc++.h>
#include<iostream>
#include<string>

using namespace std;
int main()
{
int hh,mm,ss ;
char tz[2];
cin>>hh>>mm>>ss>>tz;

if(strcmp(tz,"AM")==0 && hh==12)
{
hh=0;
}
else if(strcmp(tz,"PM")==0 && hh!=12)
{
hh += 12;
}
cout<<hh<<":"<<mm<<":"<<ss;
return 0;
}

与预期的输出不同,即 19:05:45,我得到 7:0:0

您的语句cin>>hh>>mm>>ss>>tz;不考虑输入中的冒号。这是一个例子,说明大致正确的代码实际上根本没有用。你必须获得完全正确的代码。你不能只是写一些大致正确的东西,并希望计算机能理解你的意思。

您在声明tz的方式中也有错误。请记住,对于 C 样式字符串,您必须为 NUL 终止符留出空间。所以你需要一个比字符串的最大长度更大的数组,即char tz[3];.

另一个问题是标题。strcmp的正确标头是#include <cstring>(<string>标头用于您不使用C++字符串),<bits/stdc++.h>不是标准的C++标头,您应该摆脱使用它的习惯。

这是我可以做到这一点的方法

int hh, mm, ss;
char dummy1, dummy2, tz[3];
cin >> hh >> dummy1 >> mm >> dummy2 >> ss >> tz;

虚拟变量的目的是读取冒号。你对冒号不感兴趣,但你不能忽略它们。

此代码不检查输入中的错误,这在实际程序中将是一个严重的问题。但也许对于一个无关紧要的教程程序。

在这里仔细查看您的输入。
输入07:00:05PM,
在这里经过小时,分钟,有一个冒号,但您在输入过程中没有考虑它。因此,请在一小时和分钟后输入冒号。

例如:

char tz[3],colon;
cin>>hh>>colon>>mm>>colon>>ss>>tz;

完整代码将是:

#include <bits/stdc++.h>
#include<iostream>
#include<string>

using namespace std;
int main()
{
int hh,mm,ss ;
char tz[3],colon;
cin>>hh>>colon>>mm>>colon>>ss>>tz;
if(strcmp(tz,"AM")==0 && hh==12)
{
hh=0;
}
else if(strcmp(tz,"PM")==0 && hh!=12)
{
hh += 12;
}
cout<<hh<<":"<<mm<<":"<<ss;
return 0;
}

如果您的格式是固定的,那么就地修改字符串呢?

if (time[8] == 'P') {
if (time[1] < '8') {
time[1]+= 2; time[0]+= 1; // No carry
}
else {
time[1]-= 8; time[0]+= 2; // Carry
}
}

(这假定 ANSI 整理序列。它的效率提高了一百万倍。