12小时到24小时时间转换

时间:2019-02-09 11:16:53

标签: c++ string time

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

输入字符串采用 HH MM SSpp 的形式,其中 HH 是一个小时两位数字,前导零, MM 分钟, SS 秒, pp 是AM或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;
}

是否存在一些逻辑错误?我知道解决该问题的另一种方法,但是如果有人可以帮助我,那将是很好的。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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_ 's answer

结果在这里:

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。 < / p>

重要说明: 该代码在hackerrank上将失败,因为它将12:15:00 pm转换为24:15:00而不是12:15 :00。此外,上午12:00:00将在12:00:00而不是00:00:00转换。有关wikipedia的更多信息。 Online demo关于如何解决这些特殊情况