空字符串加一个int
empty string plus an int?
这是我的代码的一部分:
//num is an int
string s = "" + num;
当我在Macbook上的Xcode中运行这个时,s将被分配给一个奇怪的字符串。有人能向我解释一下吗?我真的很困惑。谢谢
我假设string
是指在标准标头<string>
中声明的std::string
类型。您还没有将其作为上下文给出——从技术上讲,根据您提供的信息,它可能是某个先前的typedef
或宏。
原因的解释
string s = "" + num;
给出了一个"奇怪的字符串",即""
在内存中表示为一个值为零的char
的const
数组。在表达式"" + num
中,""
被转换为指针(等于值为零的char
的地址),然后+ num
给出存储器中某个位置的地址,即后面的num
个字符。
如果num
为非零,则该内存地址可能不存在,或者(如果存在)可能包含任意数据。
在任何情况下,该指针都会传递给std::string
的构造函数(以便构造s
)。该构造函数从给定的地址开始,并不断将数据复制到std::string
中,直到找到值为零的字符为止。介于两者之间的角色可以是任何东西——它们是发生在那个记忆位置的任何东西。
形式上,C++标准将所有这些(通过坏指针访问数据)描述为未定义的行为。这意味着C++标准没有说明什么结果是允许的,所以任何结果都是允许的。这可能会导致字符串中出现奇怪的数据。操作系统可能会检测到你的程序正在访问它不应该访问的内存,并强制终止你的程序。它可以重新格式化你的硬盘并重新安装你的操作系统。
假设您只想将num
写入字符串(例如,值为42
的num
会产生类似"42"
的字符串),那么通常的技术是将num
转换为std::string
。例如
std::string s = to_string(num); // C++11 or later
或
#include <sstream> // pre_C++11 (albeit valid in C++11)
std::ostringstream ostr;
ostr << num;
std::string s(ostr.str());
string s = std::to_string(num);
试试这个。
关于std::to_string()
的想法很好,但不幸的是,它只适用于C++11,我见过一些编译器虽然支持C++11,但并不完全支持这一方面。如果你能用,就用它。
如果它不起作用,试试这个:
#include <sstream>
...
int num = 5;
float rNum = 63.2;
std::stringstream ss;
ss << num;
ss << rNum;
std::string s;
ss >> s;
cout << s << endl;
您将获得格式化为一个字符串的float和int值。事实上,我认为如果有多个变量被格式化,那么使用字符串流会更好。用ss >> s
把它们作为字符串拉出,就完成了!
得到不希望的答案的原因是num
对空字符串s
的算术加法,这基本上类似于C
语言中的指针加法。
请参阅示例以获得更好的解释:
例如。1:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 0;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出:1234567890
例如。2:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 1;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出:234567890
例如。3:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 4;
string s = "1234567890" + num;
cout << s << endl;
return 0;
}
输出:567890
例如。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
具有垃圾值,这导致了未定义的结果。
在将num
附加到空字符串s
之前,最好使用to_string()
。
示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
int num = 1000;
string s = "" + to_string(num);
cout << s << endl;
return 0;
}
- 包装一个对象并假装它是一个 int
- 无法一次从二进制文件中读取一个 int
- 当我输入一个字母时,cin 输入(输入是一个 int),而不是打印错误一次,它打印正确一次,然后在循环的其余部分打印 i
- 为什么我不能使用与"常量字符*"相同的"const int*"创建一个 int 数组?
- 如何将私有整数从A类传递到C 类B类的另一个INT变量
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 结构C++可以用 0 初始化,但不能用另一个 int 初始化
- 将一个int []转换为字符串,而无需明确的c 循环
- 如何通过另一个int变量递增int变量
- C++根据输入返回一个字符串或一个int
- 如何在另一个结构 arrya 中的一个结构中初始化一个 int 数组
- 两个 UShorts 之间的操作在 VC2015 中给出了一个 int
- turbo 如何在 C++ 的系统() 函数中放入一个 int varriable
- 无限输入C 计算器要结束计算,需要再进行一个INT
- 带有两个INT列表的结构将减少为一个INT
- 在c#中构建一个int数组,每个int调用c++或在c++中构建并传递给c#
- 对于具有 3 个无符号字符和一个 int 的结构来说,对于unordered_map来说,什么是好的哈希函数?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 如何在C 中的结构内设置一个int数组
- 为什么在我的测试程序中,从字符缓冲区读取一个int时,"std::copy"5x(!)比"