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

问题描述 投票:-7回答:1

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

c++ string
1个回答
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样式的字符串)。

© www.soinside.com 2019 - 2024. All rights reserved.