c++ - 在 RHEL Linux 中,使用分配有 ""(空字符串值)的 std::string 变量会给出垃圾值

标签 c++ linux

在 RHEL Linux 中,使用分配有“”(空字符串值)的 std::string 变量会给出垃圾值

例如下面的代码

std::string str = "";

printf("%s",str.c_str());

我还有一个代码示例

int main()
{
string str = "";
printf("Str = %s\n" ,str.c_str());

string strTemp;
char * pcTRMP = new char [10];

//sprintf(pcTRMP,"%d" ,7);
sprintf((char*)strTemp.c_str() ,"%d" ,7);
printf("Str = %s\n" ,str.c_str());

sprintf((char*)strTemp.c_str() ,"%d" ,8);
printf("Str = %s\n" ,str.c_str());

return 0;
}

结果是 强度=7 强度=8

其中没有对 str 变量进行赋值。

我们在互联网上查了很多地方。 我希望有人能帮助我解决这个问题。

相同的代码可以在旧版本的 RHEL Linux 中运行。

最佳答案

写入 std::string::c_str() 返回的指针是非法的。 documentation for std::string 明确表明这会导致未定义的行为。该指针最初的类型为 const char * ,专门表达此限制。

关于程序显示的结果,我猜这两个字符串都指向同一个空字符串缓冲区(一些内部 const char empty[] = "" ),因此写入一个字符串会导致更改所有空字符串的值。

如果你确实需要使用sprintf而不是std::stringstream ,您可以使用字符 vector 代替字符串:

std::vector<char> buf(10);
sprintf(buf.data(), "%d" ,7);
std::string result = buf.data();

关于c++ - 在 RHEL Linux 中,使用分配有 ""(空字符串值)的 std::string 变量会给出垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738462/

相关文章:

linux - 如何从 Bash 脚本列出目标 PID 的曾孙 PID?

通过 PuTTy 运行 Nvim-R : setting up r_term_cdm

linux - 重启后使 iptables 规则保持不变

c++ - 在 C++ 方法中更改结构变量

c++ - 在没有函数指针/内联的情况下将 C++ 函数作为参数传递?

c++ - NCURSES:创建没有循环的标题栏

linux - 如何使rsync用实际数据替换符号链接(symbolic link)?

c++ - 跳转到文件中位置的最快方法 (C/C++)

c++ - 程序执行步骤

linux - 为什么结束时间与此 shell 脚本中的开始时间相同?