C++ 字符串追加上的奇怪行为
strange behavior on c++ string append
我的类中的 c++ 字符串对象有一个奇怪的问题,s.append(ptr2str ....);
class cRegexMatches {
public:
char *ptr2str;
int *pOffsets;
cRegexMatches() { ptr2str = NULL; pOffsets=NULL;}
void update(char *p, int *offsets) {
ptr2str = p; pOffsets = offsets;
printf("ptr2str=%p %s|n", p, p);
}
string operator [] (int id) {
string s;
printf("operator[] %p %s|", ptr2str, ptr2str);
int i;
for (i=0; i<4; i++) printf(" %d", pOffsets[i]);
printf("n");
if (!ptr2str) return s;
if (pOffsets[2 * id + 1] == 0) return s;
int len = pOffsets[2 * id + 1] - pOffsets[2 * id];
printf("size %d %ld before %sn", s.size(), len, ptr2str + pOffsets[2 * id]);
s.append(ptr2str + pOffsets[2 * id], len);
cout << s << endl;
return s;
}
};
使用以下代码,它可以正常运行。
int main(int argc, char *argv[]) {
char *p = "10.20.0.111:8080";
int pInts[] = {0, 16, 0,16};
regmatches.update(p, &pInts[0]);
string s = regmatches[0];
int i;
for (i=0; i<s.size(); i++) {
printf("%cn", s.c_str()[i]);
}
return 0;
}
但是在我的项目中,根据 s.append
之前的调试printf(..)
语句和之后的 cout ...
,行s.append(ptr2str + pOffsets[2 * id], len);
似乎损坏了第一个字节为 \x00。
知道是什么导致了这种奇怪的行为吗? 谢谢!
更新 1
感谢@user657267的建议,这里简要介绍了如何在我的项目中使用代码。 看起来很无辜。
cRegexMatches globalVar;
//p points to some c string
//pInt points to an array of integers, in my case, it's 0, 16, 0, 16
globalVar.update(p, pInt);
cout << globalVar[0]
现在,我找到了一个解决方法:我将行s.append(ptr2str + pOffsets[2 * id], len);
更改为return string(ptr2str + pOffsets[2 * id], len);
,并且工作正常。 但我仍然很好奇是什么导致了这种奇怪的行为。
我相信
问题可能是您对 main 中字符串的定义。
char* p = "10.20.0.111:8080";
应该是
char p[] = "10.20.0.111:8080";
只有第二个定义在堆栈上保留内存。
相关文章:
- 如何在不使用追加函数的情况下追加到字符串C++?
- 字符串的异常行为会追加属性 C++
- 附加作为空字符串的 ostream 可防止进一步追加
- 字符串反向迭代器自追加的持久性
- C++字符串追加的时间复杂度 - 字符串 1 += 字符串 2;
- C++ 字符串追加和运算符 += 之间的区别
- 无法追加到 COM Dll 中的字符串 奇怪的行为
- 将字符串追加到 lpCmdLine WinMain
- 将字符数组追加到字符串 C++
- 追加到字符串的 C++
- 如何在 C# 中将整个数组追加到字符串
- 将字符串追加到宏中的__FUNCTION__
- 限制追加的字符串数
- 将循环的输出追加到 c++ 中字符串向量的元素 已编辑
- 字符串擦除追加
- 应用程序在向字符串追加数据时崩溃
- 有效地向字符串追加或插入可变数量的空格
- 在C中使用strcat向字符串追加字符
- 向vector字符串追加
- C++ 字符串追加上的奇怪行为