空字符串加一个int

empty string plus an int?

本文关键字:一个 int 字符串      更新时间:2023-10-16

这是我的代码的一部分:

//num is an int
string s = "" + num;

当我在Macbook上的Xcode中运行这个时,s将被分配给一个奇怪的字符串。有人能向我解释一下吗?我真的很困惑。谢谢

我假设string是指在标准标头<string>中声明的std::string类型。您还没有将其作为上下文给出——从技术上讲,根据您提供的信息,它可能是某个先前的typedef或宏。

原因的解释

string s = "" + num;

给出了一个"奇怪的字符串",即""在内存中表示为一个值为零的charconst数组。在表达式"" + num中,""被转换为指针(等于值为零的char的地址),然后+ num给出存储器中某个位置的地址,即后面的num个字符。

如果num为非零,则该内存地址可能不存在,或者(如果存在)可能包含任意数据。

在任何情况下,该指针都会传递给std::string的构造函数(以便构造s)。该构造函数从给定的地址开始,并不断将数据复制到std::string中,直到找到值为零的字符为止。介于两者之间的角色可以是任何东西——它们是发生在那个记忆位置的任何东西。

形式上,C++标准将所有这些(通过坏指针访问数据)描述为未定义的行为。这意味着C++标准没有说明什么结果是允许的,所以任何结果都是允许的。这可能会导致字符串中出现奇怪的数据。操作系统可能会检测到你的程序正在访问它不应该访问的内存,并强制终止你的程序。它可以重新格式化你的硬盘并重新安装你的操作系统。

假设您只想将num写入字符串(例如,值为42num会产生类似"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;
}
相关文章: