C ++:为什么我的字符串没有被打印出来?

时间:2017-12-01 02:54:52

标签: c++ string

编辑 - 这是非常的菜鸟和初学者问题因为我刚开始学习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]时,这给了我正确的结果。

1 个答案:

答案 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风格的字符串)。