以下是我的代码的一部分:
CMD bundle exec rackup -o 0.0.0.0 -p 9292 config.ru
当我在Macbook上的Xcode中运行时,会将s分配给一个奇怪的字符串。 任何人都可以向我解释一下吗? 我真的很困惑。 感谢。
答案 0 :(得分:4)
我认为string
是指std::string
类型,在标准标题<string>
中声明。您没有将其作为上下文 - 从技术上讲,您提供的信息可能是先前的typedef
或宏。
解释原因
string s = "" + num;
给出一个“奇怪的字符串”,""
在内存中表示为一个const
的{{1}}数组,其值为零。在表达式char
中,"" + num
被转换为指针(等于""
的地址,其值为零),然后char
给出某个位置的地址在内存中,+ num
个字符。
如果num
非零,则该内存地址可能不存在,或者(如果存在)可能包含任意数据。
无论如何,该指针被传递给num
的构造函数(为了构造std::string
)。该构造函数从给定的地址开始,并将数据保持复制到s
,直到找到值为零的字符。中间的字符可以是任何东西 - 它们都是在该内存位置发生的任何事情。
正式地,C ++标准将所有这些(通过错误指针访问数据)描述为未定义的行为。这意味着C ++标准没有说明允许的结果,因此允许任何结果。它可能会导致字符串中出现奇怪的数据。操作系统可能会检测到您的程序不应该访问内存,并强制终止您的程序。它可以重新格式化您的硬盘并重新安装您的操作系统。
假设您只想将std::string
写入字符串(例如num
,其值num
会产生类似42
的字符串),那么通常的技巧就是转换"42"
到num
。例如;
std::string
或
std::string s = to_string(num); // C++11 or later
答案 1 :(得分:1)
string s = std::to_string(num);
试试这个。
答案 2 :(得分:0)
你得到不受欢迎的答案的原因是num
向空字符串s
算术添加,这基本上就像C
语言中的指针添加。
请参阅示例以获得更好的解释:
<强> EG。 1:强>
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 0;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出:1234567890
<强> EG。 2:强>
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 1;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出:234567890
<强> EG。 3:强>
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 4;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出 567890
<强> EG。 4:强>
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 8;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出 90
等......
因为,此处字符串s
为空,num
具有垃圾值,导致未定义的结果。
在将to_string()
附加到空字符串num
之前,最好使用s
。
示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 1000;
string s = "" + to_string(num);
cout << s << endl;
return 0;
}
答案 3 :(得分:0)
关于/home/jason/Downloads/findspark-master
的想法是好的,但不幸的是它只适用于C ++ 11,我看到虽然它们支持C ++ 11但并不完全支持这方面的编译器。如果您可以使用它,请使用它。
如果不起作用,请尝试:
std::to_string()
您将把float和int值格式化为一个字符串。实际上,如果你有多个变量被格式化,我认为你最好使用stringstreams。用#include <sstream>
...
int num = 5;
float rNum = 63.2;
std::stringstream ss;
ss << num;
ss << rNum;
std::string s;
ss >> s;
cout << s << endl;
作为字符串将它们拉出来,你就完成了!