【问题标题】:12 hour to 24 hour time conversion12小时到24小时时间转换
【发布时间】:2019-02-09 11:16:53
【问题描述】:

我正在尝试从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;
}

有什么逻辑错误吗?我知道解决这个问题的另一种方法,但如果有人能帮助我解决这个问题,那就太好了。

【问题讨论】:

  • getenv("OUTPUT_PATH"));,那个环境变量是你设置的吗?就像在您运行此程序的终端中一样?
  • 您将数字与数字混淆了。 '1' * 10 不是 10;使用 ASCII 编码是 490。
  • @melpomene 是的,这是真的。但这与 OP 的具体问题有关吗?
  • @JoeyMallone 好问题!你是对的:这是有风险的;并且文件被打开,并且没有检查这是否成功。但是,如果您将所有内容都输出到 cout,则 OP 的结果是相同的 ;-)

标签: c++ string time


【解决方案1】:

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

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

【讨论】:

  • 这当然是一个有效的评论!但是,尽管有您的建议,OP 仍将继续返回空字符串。甚至对于不需要进行数学运算的 AM 字符串。因为 p 被初始化为一个空字符串,这使得任何访问 p[x] 的指令都是 UB ;-)
【解决方案2】:

主要问题

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

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

对于下午时间,您可以进入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。

重要提示:此代码将在hackerrank 上失败,因为它将12:15:00pm 转换为24:15:00 而不是12:15:00。此外,上午 12:00:00 将转换为 12:00:00 而不是 00:00:00。更多关于wikipediaOnline demo关于如何处理这些特殊情况

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2018-08-02
    • 1970-01-01
    • 2013-10-14
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多