有人可以向我解释为什么我的字符串没有显示在输出中它经常发生在我身上,这是一个简单的例子,
can someone explain to me why my string is not not showing in output it happens to me a lot and this is a simple example,
谁能告诉我为什么 s 没有出现。
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a="1 23";
string s="";
if(a[1]==' '){s[0]=a[1];
cout<<s; }
return 0;
}
这个作业
if(a[1]==' '){s[0]=a[1];
调用未定义的行为,因为字符串 s
为空,您不能使用下标运算符为空字符串赋值。
你可以这样写
if(a[1]==' '){s += a[1];
注意,在这种情况下,字符串 s 将包含 space 字符。为了使其可见,您可以编写例如
#include <iostream>
#include <iomanip>
#include <string>
//...
std::cout<< std::quoted( s ) << '\n';
或
std::cout << '\'' << s << "\'\n";
您没有为 s
分配任何字符内存以供参考,因此 s.size()
为 0,因此 [0]
超出范围,向其写入任何内容 undefined behavior 1.
1:在 C++11 及更高版本中,您可以安全地将 '[=14=]'
写入 s[s.size()]
,但您不会在这里这样做。
试试这个:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a = "1 23";
string s = "";
if (a[1] == ' ') {
s += a[1];
// alternatively:
s = a[1];
// alternatively:
s.resize(1);
s[0] = a[1];
cout << s;
}
return 0;
}
请注意 a[1]
是空白字符 ' '
,因此虽然您可以将该字符分配给 s
,并且它会打印到控制台,但您不会(轻松)在您的控制台中直观地看到它。 a
中的任何其他字符都会更明显。
我的猜测是,这是对字符串进行解析的幼稚尝试。这是您要找的吗?
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a = "1 23";
string s;
if (a[1] == ' ') {
s = a.substr(2);
cout << s;
}
return 0;
}
那是因为“s”是大小为 0 的空字符串。
这意味着其中没有索引 [0] 处的元素。
当您向“s”询问 [0] 元素时,它会导致 UB。
如果你想在"s"后面加上[1],你可以使用:
s.push_back(a[1]);
或者:
s += a[1];
或者:
s.insert(s.begin(), a[1]); // That's bad way, dont use it.
谁能告诉我为什么 s 没有出现。
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a="1 23";
string s="";
if(a[1]==' '){s[0]=a[1];
cout<<s; }
return 0;
}
这个作业
if(a[1]==' '){s[0]=a[1];
调用未定义的行为,因为字符串 s
为空,您不能使用下标运算符为空字符串赋值。
你可以这样写
if(a[1]==' '){s += a[1];
注意,在这种情况下,字符串 s 将包含 space 字符。为了使其可见,您可以编写例如
#include <iostream>
#include <iomanip>
#include <string>
//...
std::cout<< std::quoted( s ) << '\n';
或
std::cout << '\'' << s << "\'\n";
您没有为 s
分配任何字符内存以供参考,因此 s.size()
为 0,因此 [0]
超出范围,向其写入任何内容 undefined behavior 1.
1:在 C++11 及更高版本中,您可以安全地将 '[=14=]'
写入 s[s.size()]
,但您不会在这里这样做。
试试这个:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a = "1 23";
string s = "";
if (a[1] == ' ') {
s += a[1];
// alternatively:
s = a[1];
// alternatively:
s.resize(1);
s[0] = a[1];
cout << s;
}
return 0;
}
请注意 a[1]
是空白字符 ' '
,因此虽然您可以将该字符分配给 s
,并且它会打印到控制台,但您不会(轻松)在您的控制台中直观地看到它。 a
中的任何其他字符都会更明显。
我的猜测是,这是对字符串进行解析的幼稚尝试。这是您要找的吗?
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a = "1 23";
string s;
if (a[1] == ' ') {
s = a.substr(2);
cout << s;
}
return 0;
}
那是因为“s”是大小为 0 的空字符串。 这意味着其中没有索引 [0] 处的元素。 当您向“s”询问 [0] 元素时,它会导致 UB。
如果你想在"s"后面加上[1],你可以使用:
s.push_back(a[1]);
或者:
s += a[1];
或者:
s.insert(s.begin(), a[1]); // That's bad way, dont use it.