连接字符串的意外行为
Unexpected behavior concatenating string
我试图在 C++11 中连接两个字符串,但我经常遇到意外行为。
首先,我有一个函数可以将任何类型转换为字符串:
template <class T>
static inline const char * toStr(T arg) {
stringstream ss;
ss << arg;
return (ss.str()).c_str();
}
然后,我像这样使用这个函数:
string measure_name;
for (unsigned long j = 0; j < 1280; j++) {
measure_name = string("ADC_") + toStr(j);
cout << measure_name << endl;
}
一切顺利,直到我达到一个 4 位数 (> 999):
我的变量 measure_name
通常等于“ADC_ADC_”...而且它是随机发生的。我做了一些研究,但没有发现任何关于这种奇怪行为的信息。
请注意,如果 toStr
returns 是 string
而不是 const char *
,则此问题已解决。
此外,如果我尝试打印返回值,我从来没有看到它等于“ADC_ADC_”,所以我相信真正的问题来自连接指令:
string measure_name;
for (unsigned long j = 0; j < 1280; j++) {
const char* tmp = toStr(j);
if (!strcmp(toStr(j), "ADC_ADC_"))
cout << "bug" << endl; //never happens
measure_name = string("ADC_") + tmp; //problem comes from here
cout << measure_name << endl;
}
我只是想了解我在那里做错了什么...我知道我使用的是非常古老的 C++,但无论如何它应该可以工作。
感谢您的帮助。
这里
return (ss.str()).c_str();
您正在 return 指向临时 std::string
缓冲区的指针(return 来自 str()
)。来自函数的指针 return 对调用者来说是无用的,因为它指向的 std::string
已经消失了。
指针就是指针。如果你想要一个字符串,return一个std::string
。如果你想 return a const char*
那么你需要将字符串存储在某个地方并管理它的生命周期。
std::string
确实管理字符数组的生命周期,所以只需执行:
template <class T>
static inline std::string toStr(T arg) {
stringstream ss;
ss << arg;
return ss.str();
}
如果有人需要 char
的 c 数组,他们仍然可以调用 c_str
(只要 std::string
还活着就可以使用它)。
考虑使用 std::to_string
.
而不是 toStr
我试图在 C++11 中连接两个字符串,但我经常遇到意外行为。
首先,我有一个函数可以将任何类型转换为字符串:
template <class T>
static inline const char * toStr(T arg) {
stringstream ss;
ss << arg;
return (ss.str()).c_str();
}
然后,我像这样使用这个函数:
string measure_name;
for (unsigned long j = 0; j < 1280; j++) {
measure_name = string("ADC_") + toStr(j);
cout << measure_name << endl;
}
一切顺利,直到我达到一个 4 位数 (> 999):
我的变量 measure_name
通常等于“ADC_ADC_”...而且它是随机发生的。我做了一些研究,但没有发现任何关于这种奇怪行为的信息。
请注意,如果 toStr
returns 是 string
而不是 const char *
,则此问题已解决。
此外,如果我尝试打印返回值,我从来没有看到它等于“ADC_ADC_”,所以我相信真正的问题来自连接指令:
string measure_name;
for (unsigned long j = 0; j < 1280; j++) {
const char* tmp = toStr(j);
if (!strcmp(toStr(j), "ADC_ADC_"))
cout << "bug" << endl; //never happens
measure_name = string("ADC_") + tmp; //problem comes from here
cout << measure_name << endl;
}
我只是想了解我在那里做错了什么...我知道我使用的是非常古老的 C++,但无论如何它应该可以工作。
感谢您的帮助。
这里
return (ss.str()).c_str();
您正在 return 指向临时 std::string
缓冲区的指针(return 来自 str()
)。来自函数的指针 return 对调用者来说是无用的,因为它指向的 std::string
已经消失了。
指针就是指针。如果你想要一个字符串,return一个std::string
。如果你想 return a const char*
那么你需要将字符串存储在某个地方并管理它的生命周期。
std::string
确实管理字符数组的生命周期,所以只需执行:
template <class T>
static inline std::string toStr(T arg) {
stringstream ss;
ss << arg;
return ss.str();
}
如果有人需要 char
的 c 数组,他们仍然可以调用 c_str
(只要 std::string
还活着就可以使用它)。
考虑使用 std::to_string
.
toStr