请使用以下代码:
#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附加到字符串不能抛出访问冲突?
答案 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();