首页 > 后端开发 > C++ > 为什么 `printf` 会导致 `std::string` 出现意外行为,以及如何修复它?

为什么 `printf` 会导致 `std::string` 出现意外行为,以及如何修复它?

DDD
发布: 2024-12-31 13:01:11
原创
707 人浏览过

Why Does `printf` Cause Unexpected Behavior with `std::string`, and How Can I Fix It?

理解 printf 与 std::string 的使用

尽管 std::string 是 std 命名空间的成员,但尝试将其与 printf 一起使用会导致意外的结果行为,如以下代码片段所示:

#include <iostream>
#include <string>

int main()
{
    using namespace std;

    string myString = "Press ENTER to quit program!";
    cout << "Come up and C++ me some time." << endl;
    printf("Follow this command: %s", myString);
    cin.get();

    return 0;
}
登录后复制

出现此问题是因为 printf 不是类型安全的并且依赖于C 风格的字符串。要解决此问题,有几种方法可用:

使用 std::cout

由于 std::string 支持运算符重载,因此可以使用 std::cout:

std::cout << "Follow this command: " << myString;
登录后复制

提取 C 风格字符串

如果需要提取 C 风格字符串,则c_str() 方法可用于获取以 null 结尾的 const char *:

printf("Follow this command: %s", myString.c_str());
登录后复制

使用可变参数模板

或者,可变参数模板可以提供 printf 的类型安全替代方案。可以在此处找到示例实现:https://stackoverflow.com/a/15014001。 Boost 提供了与 boost::format 类似的功能。

C 23 更新

C 23 引入了 std::print,它结合了两种方法的优点,允许使用 std::format:

#include <print>

std::print("Follow this command: {}", myString);
登录后复制
的类型安全输出

以上是为什么 `printf` 会导致 `std::string` 出现意外行为,以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板