Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:为什么我的字符串没有打印出来?_C++_String - Fatal编程技术网

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

C++ C++;:为什么我的字符串没有打印出来?,c++,string,C++,String,我正在尝试将时间从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

我正在尝试将时间从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;
}
#包括
使用名称空间std;
字符串时间转换(字符串s){
字符串r;
内高,毫米,不锈钢;
hh=(s[0]-'0')*10+(s[1]-'0');
mm=(s[3]-'0')*10+(s[4]-'0');
ss=(s[6]-'0')*10+(s[7]-'0');
如果(hh>s;
字符串结果=时间转换;
看

操作员[] 未执行边界检查。如果
pos>size()
,则行为未定义

定义
string r
时,其
size()
为零,因此所有字符分配都是未定义的行为。您可能需要首先:

或者,一个接一个地:

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
不是以null结尾的(它不是C样式的字符串).

r
的大小为
0
。您从不在
r
中添加任何字符。无关:
#include使用命名空间std;
是一种危险的组合。第一种组合几乎包括整个标准库。她将刚刚包含在全局命名空间中的成千上万个标识符放在第二位l与您声明的任何标识符竞争。这可能会导致极其神秘的错误消息和非常奇怪的运行时行为,因为您甚至不知道存在的东西会被使用,而不是您原本打算使用的。请非常小心地使用,不要这样做。或者使用
+=
使其更自然。此外,您不需要这样:
 r=”“;
。字符串默认为空。而且,您也不需要:
r+='\0';
std::string
不需要以NULL结尾。@NikosC。OP的代码添加了一个终止零。是的,但指出答案中的错误和/或错误假设是个好主意。@NikosC。找到您了。添加了它
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';