空字符串加一个int?

时间:2016-01-09 05:19:01

标签: c++ string int

以下是我的代码的一部分:

CMD bundle exec rackup -o 0.0.0.0 -p 9292 config.ru

当我在Macbook上的Xcode中运行时,会将s分配给一个奇怪的字符串。 任何人都可以向我解释一下吗? 我真的很困惑。 感谢。

4 个答案:

答案 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; 作为字符串将它们拉出来,你就完成了!