12小时到24小时的时间转换

12 hour to 24 hour time conversion

本文关键字:时间 转换 24小时 12小时      更新时间:2023-10-16

我正试图从hackerlink编写这个c++程序,但在我的输出中,我得到的只是一个空白。

输入字符串的形式为HHMMSSpp,其中HH是以零开头的两位数字表示的小时,MM表示分钟,SS为秒,1ppAM或PM。

#include <bits/stdc++.h>
#include<iostream>
#include<string>
using namespace std;
string timeConversion(string s) 
{
string p;
int i,j;
if(s[8]==80){                   // checking if it is AM or PM
int x = s[0]*10 + s[1] +12;
int y = x%10;
int z = x/10;
s[0]= z;
s[1]= y;
for(i=0;i<10;i++){
p[i]=s[i];
}
}
string newt= p.substr(0, p.size()-2);      //removing last two characters 
return newt;
}
int main()
{ 
ofstream fout(getenv("OUTPUT_PATH"));
string s;
getline(cin, s);                
string result = timeConversion(s);
fout << result << "n";
enter code here
fout.close();
return 0;
}

是否存在逻辑错误?我知道这个问题的另一种方法,但如果有人能帮助我,那就太好了。

问题在于将字符数字(例如s[0])视为整数。

如果你确信你在处理数字,那么对字符进行算术运算的方法是减去字符'0'的值,就像这样:s[0] - '0'。结果将是整数。

主要问题

timeConversion()函数中,您定义了一个字符串p,它由字符串默认构造函数初始化为"。

现在对于AM时间,您可以跳过if,直接转到string newt= p.substr(0, p.size()-2);,在空的p上,它只会创建一个空的newt字符串。所以您返回一个空值。每次!

对于PM时间,您可以进入if进行一些转换。不幸的是,p[i]=s[i];并没有做到你想的那样。事实上,它在空的p字符串中是越界访问。最后,p的长度仍然是0,这将导致返回一个空值(在最好的情况下)。

解决方案的开始

在构造时初始化p

string p=s;

然后,该代码将立即适用于AM字符串。对于PM字符串,您仍然需要考虑与ascii和二进制数学相关的uv_的答案。

这里的结果:

string timeConversion(string s) 
{
string p=s;
int i,j;
if(s[8]=='P'){                   // checking if it is AM or PM
int x =(s[0]-'0')*10 + (s[1]-'0') +12;
p[0]= x/10 +'0';
p[1]= x%10 +'0';
}
return p.substr(0, p.size()-2);   //removing last two characters 
}

注意:这假设条目格式始终有效,并且不会使用空格代替前导0。

重要提示:此代码将在hackerbank上失败,因为它将下午12:15:00转换为24:15:00,而不是在12:15:00。此外,12:00:00am将转换为12:00:00,而不是00:00:00。有关维基百科的更多信息。关于如何解决这些特殊情况的在线演示

此代码将在考虑所有测试用例的情况下工作,只是添加了另外两个条件

string timeConversion(string s)
{
string ans=s;
if(ans[8]=='P')
{
int x = (ans[0]-'0')*10+(ans[1]-'0')+12;
//cout<<x;
if(x!=24)
{
ans[0]=x/10+'0';
ans[1]=x%10+'0';
}
}
if(ans[8]=='A')
{
int y=(ans[0]-'0')*10+ans[1]-'0';
if(y==12)
{
ans[0]='0';
ans[1]='0';
}
}
return ans.substr(0, ans.size()-2);
}