编辑 - 这是非常的菜鸟和初学者问题因为我刚开始学习C ++而我刚刚听说过stackoverflow,所以我在这里问了这个问题。我真的很傻。请不要进一步低估这个问题。我为此道歉。
我正在尝试将时间从12小时格式转换为24小时格式。这是一个我正在努力解决的黑客问题。这是我的代码: -
#include <bits/stdc++.h>
using namespace std;
string timeConversion(string s) {
string r;
int hh,mm,ss;
hh = (s[0]-'0')*10+(s[1]-'0');
mm = (s[3]-'0')*10+(s[4]-'0');
ss = (s[6]-'0')*10+(s[7]-'0');
if(hh<12 && s[8] == 'P') hh +=12;
if(hh == 12 && s[8]=='A') hh = 0;
r[0]=hh/10+'0';
r[1]=hh%10+'0';
r[2]=':';
r[3]=mm/10+'0';
r[4]=mm%10+'0';
r[5]=':';
r[6]=ss/10+'0';
r[7]=ss%10+'0';
r[8]='\0';
return r;
}
int main() {
string s;
cin >> s;
string result = timeConversion(s);
cout << result << endl;
return 0;
}
此代码提供空白输出。虽然当我输出结果[0]时,这给了我正确的结果。
答案 0 :(得分:3)
请参阅CppReference
operator []
不执行边界检查。如果
pos > size()
,则行为未定义。
定义string r
时,其size()
为零,因此所有字符分配都是未定义的行为。您可能首先要resize it:
r.resize(9);
或者,append the characters逐个:
r = "";
r.push_back(hh/10+'0');
r.push_back(hh%10+'0');
r.push_back(':');
r.push_back(mm/10+'0');
r.push_back(mm%10+'0');
r.push_back(':');
r.push_back(ss/10+'0');
r.push_back(ss%10+'0');
// This isn't necessary
// r.push_back('\0');
使用operator+=
可让您的代码看起来更自然:
r = "";
r += hh/10+'0';
r += hh%10+'0';
r += ':';
r += mm/10+'0';
r += mm%10+'0';
r += ':';
r += ss/10+'0';
r += ss%10+'0';
// This isn't necessary
// r += '\0';
请注意,您不需要终止零,因为std::basic_string
不是以空值终止的(它不是C风格的字符串)。