在c ++中将时间附加到字符串时出现访问冲突错误

时间:2012-01-26 14:46:27

标签: c++ string initialization append

请使用以下代码:

#inlcude <iostream>
#include <time.h>
using namespace std;

int main(int argc, char* argv[])
{
    time_t t;
    time(&t);

    string s = "file" + t;
    return 0;
}

string s = "file" + t

我收到访问冲突错误。

如果我将其更改为:  #inlcude     使用namespace std;

int main(int argc, char* argv[])
{
    time_t t;
    time(&t);
    int x = t;

    string s = "file" + x;
    return 0;
}

我仍然得到同样的错误。 怎么了?当然将int附加到字符串不能抛出访问冲突?

3 个答案:

答案 0 :(得分:5)

"file" + t

这根本不符合你的期望。 "file"是一个char数组。您不能将整数添加到char数组。但是您可以向指针添加整数,并且数组可以隐式转换为指针。 t的价值可能在数十亿之间。因此"file" + t的结果是一些指针距离char数组"file"大约十亿字节。然后尝试使用该指针初始化一个字符串。您不太可能合法访问此内存位置,因此您会遇到访问冲突。无论如何,它都是未定义的行为。如果你这样做了:

std::string s("file");
s += t;

您可能会遇到正确的编译错误。试试这个:

std::string s("file");
s += std::to_string((long long)t);

如果您无法使用该功能(这是C ++ 11中的新功能),那么您可以使用stringstreams:

std::ostringstream oss;
oss << "file" << t;
std::string s(oss.str());

答案 1 :(得分:2)

这不是将整数附加到字符串的标准方法。 C ++表示字符串作为指向字符数组的指针。通过向此添加一个整数,您实际上是将指针递增到可能不属于您的内存块。调查sprintf()的使用情况。

答案 2 :(得分:2)

问题是你的字符串不是字符串。

您需要记住("foo"形式的字符串文字不是std::string类型,而是const char*(实际上它们的类型为const char[N],但出于我们的目的,我们可以认为它们是指针。)

所以当你编写如下代码时:

std::string foo = "bar" + 42

然后涉及的类型如下:

std::string = const char* + int

换句话说,您的代码是向指针添加一个整数,然后结果字符指针存储为字符串。

请注意,向指针添加整数只是普通的指针算术,因此编译器不会抱怨。

如果我们这样做:

std::string foo = std::string("bar") + 42

然后我们创建一个正确的字符串,然后尝试添加42。那是没有定义的,所以我们会得到一个编译器错误(这至少比默默地做错事更好)。

正确的解决方案是使用流,如其他答案之一所示:

std::ostringstream os("file");
os << x;
std::string s = os.str();