Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >std::字符串格式,如sprintf

std::字符串格式,如sprintf
EN

Stack Overflow用户
提问于 2010-02-26 14:15:54
回答 29查看 1M关注 0票数 534

我必须用sprintf格式化std::string并将其发送到文件流中。我该怎么做呢?

EN

回答 29

Stack Overflow用户

回答已采纳

发布于 2010-02-26 14:17:59

您不能直接这样做,因为您没有对底层缓冲区的写访问权限(直到C++11为止;请参阅Dietrich Epp的comment)。您必须首先在c-string中执行此操作,然后将其复制到std::string中:

代码语言:javascript
运行
AI代码解释
复制
  char buff[100];
  snprintf(buff, sizeof(buff), "%s", "Hello");
  std::string buffAsStdStr = buff;

但我不确定你为什么不直接使用字符串流?我假设你有特定的理由不这么做:

代码语言:javascript
运行
AI代码解释
复制
  std::ostringstream stringStream;
  stringStream << "Hello";
  std::string copyOfStr = stringStream.str();
票数 394
EN

Stack Overflow用户

发布于 2011-11-11 18:04:02

在内部使用vsnprintf()的C++11解决方案:

代码语言:javascript
运行
AI代码解释
复制
#include <stdarg.h>  // For va_start, etc.

std::string string_format(const std::string fmt, ...) {
    int size = ((int)fmt.size()) * 2 + 50;   // Use a rubric appropriate for your code
    std::string str;
    va_list ap;
    while (1) {     // Maximum two passes on a POSIX system...
        str.resize(size);
        va_start(ap, fmt);
        int n = vsnprintf((char *)str.data(), size, fmt.c_str(), ap);
        va_end(ap);
        if (n > -1 && n < size) {  // Everything worked
            str.resize(n);
            return str;
        }
        if (n > -1)  // Needed size returned
            size = n + 1;   // For null char
        else
            size *= 2;      // Guess at a larger size (OS specific)
    }
    return str;
}

一种更安全、更有效的方法(我对它进行了测试,它更快):

代码语言:javascript
运行
AI代码解释
复制
#include <stdarg.h>  // For va_start, etc.
#include <memory>    // For std::unique_ptr

std::string string_format(const std::string fmt_str, ...) {
    int final_n, n = ((int)fmt_str.size()) * 2; /* Reserve two times as much as the length of the fmt_str */
    std::unique_ptr<char[]> formatted;
    va_list ap;
    while(1) {
        formatted.reset(new char[n]); /* Wrap the plain char array into the unique_ptr */
        strcpy(&formatted[0], fmt_str.c_str());
        va_start(ap, fmt_str);
        final_n = vsnprintf(&formatted[0], n, fmt_str.c_str(), ap);
        va_end(ap);
        if (final_n < 0 || final_n >= n)
            n += abs(final_n - n + 1);
        else
            break;
    }
    return std::string(formatted.get());
}

为了符合va_start的要求,通过值传递fmt_str

注意:“更安全”和“更快”版本在某些系统上不起作用。因此,这两种方法仍在列表中。此外,“更快”完全取决于预分配步骤是否正确,否则strcpy会使其变慢。

票数 247
EN

Stack Overflow用户

发布于 2012-04-14 02:04:27

我使用vsnprintf编写了自己的代码,这样它就可以返回字符串,而不必创建自己的缓冲区。

代码语言:javascript
运行
AI代码解释
复制
#include <string>
#include <cstdarg>

//missing string printf
//this is safe and convenient but not exactly efficient
inline std::string format(const char* fmt, ...){
    int size = 512;
    char* buffer = 0;
    buffer = new char[size];
    va_list vl;
    va_start(vl, fmt);
    int nsize = vsnprintf(buffer, size, fmt, vl);
    if(size<=nsize){ //fail delete buffer and try again
        delete[] buffer;
        buffer = 0;
        buffer = new char[nsize+1]; //+1 for /0
        nsize = vsnprintf(buffer, size, fmt, vl);
    }
    std::string ret(buffer);
    va_end(vl);
    delete[] buffer;
    return ret;
}

所以你可以像这样使用它

代码语言:javascript
运行
AI代码解释
复制
std::string mystr = format("%s %d %10.5f", "omg", 1, 10.5);
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2342162

复制
相关文章
sprintf格式化字符串
arg1、arg2、++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
字节脉搏实验室
2020/05/13
1.8K0
sprintf函数---c语言字符串格式化
sprintf函数 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> void test() { //s
大忽悠爱学习
2021/03/02
1.1K0
sprintf函数---c语言字符串格式化
小生归一(七)sprintf字符串格式化漏洞
通过fuzz得知,在php的格式化字符串中,%后的一个字符(除了'%')会被当作字符类型,而被吃掉,单引号',斜杠\也不例外。
Power7089
2020/07/27
1K0
小生归一(七)sprintf字符串格式化漏洞
深入解析sprintf格式化字符串带来的注入隐患!
对每个列进行dump但是dump下来不对,找了一波原因没有找到,开始用脚本跑 跑完后才发现sqlmap跑出来的列不对,应该是flag,于是
Java程序猿
2023/02/17
1.7K0
[Go]fmt Sprintf的格式占位符%
普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式。 Printf("%v", people) {zhangsan} %+v 打印结构体时,会添加字段名 Printf("%+v", people) {Name:zhangsan} %#v 相应值的Go语法表示 Printf("#v", people) main.Human{Name:"zhangsan"} %T 相应值的类型的Go语法表示 Printf("%T", people) main.Human %% 字面上的百分号,并非值的占位符 Prin
唯一Chat
2021/04/09
3.5K0
Go 中的格式化字符串`fmt.Sprintf()` 和 `fmt.Printf()`
在 Go 中,可以使用 fmt.Sprintf() 和 fmt.Printf() 函数来格式化字符串,这两个函数类似于 C 语言中的 scanf 和 printf 函数。
除除
2023/06/17
6100
Go 中的格式化字符串`fmt.Sprintf()` 和 `fmt.Printf()`
C语言_sprintf固定字符串输出位数
sprintf 函数是一个 C 语言中的函数,也被许多其他编程语言所支持。它允许你根据一组变量来格式化和存储一个字符字符串。sprintf 函数可以用于将格式化的数据写入字符数组或字符串中,然后根据需要打印或存储该字符串。sprintf 函数的第一个参数是格式化数据将被写入的字符数组或字符串,随后的参数是用于生成格式化输出的变量。sprintf 函数允许你控制输出的格式,包括小数点后的位数、字段的宽度和文本的对齐方式等。
DS小龙哥
2023/03/17
1.7K0
C语言_sprintf固定字符串输出位数
sprintf函数的用法linux,sprintf函数用法解析
产生“FFFFFFFF”,怎么回事?因为spritnf 是个变参函数,除了前面两个
全栈程序员站长
2022/07/04
1.7K0
WriteUp分享 | LCTF的一道padding oracle攻击+sprintf格式化字符串导致的SQL注入
0x00题目 http://111.231.111.54/ 泄露了两个源码 .login.php.swp .admin.php.swp 源码丢在最下面,可用vim -r恢复 第一次接触padding
安恒网络空间安全讲武堂
2018/02/06
1.2K0
WriteUp分享 | LCTF的一道padding oracle攻击+sprintf格式化字符串导致的SQL注入
c++ sprintf_s 和 sprintf 区别 double转换成string型(浮点数的格式化)(转载)
https://www.cnblogs.com/finallyliuyu/archive/2010/08/27/1810071.html
用户7886150
2021/02/15
2.4K0
std::function与std::bind
一、背景介绍: 函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器,他们配合起来能够很好的替代函数指针。
灰子学技术
2022/01/18
9620
[Golang] fmt.Sprintf拼接字符串interface{}或其他类型
比如entId 是interface{} 类型 , visitorName是字符串类型
唯一Chat
2022/02/22
5360
C++11异步编程(std::async, std::future, std::packaged_task, std::promise)
       std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。在之前我们都是通过thread去创建一个子线程,但是如果我们要得到这个子线程所返回的结果,那么可能就需要用全局变量或者引用的方法来得到结果,这样或多或少都会不太方便,那么async这个函数就可以将得到的结果保存在future中,然后通过future来获取想要得到的结果。async比起thread来说可以对线程的创建又有了更好的控制,比如可以延迟创建。下面先介绍一下std::future, std::packaged_task, std::promise。
Ch_Zaqdt
2020/02/15
16.2K0
sprintf的用法
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf有用得多。 sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数: 格
用户1624346
2018/04/11
4.8K0
sprintf的用法
cstring头文件都有什么函数_cstdlib是什么头文件
(1) 上面sscanf写法的作用是把字符数组str中的内容以”%d”的格式写到n中(还是从左至右),示例如下:
全栈程序员站长
2022/09/30
2.3K0
cstring头文件都有什么函数_cstdlib是什么头文件
理解std::move和std::forward
std::move和std::forward只是执行转换的函数(确切的说应该是函数模板)。std::move无条件的将它的参数转换成一个右值,而std::forward当特定的条件满足时,才会执行它的转换。这就是它们本来的样子.这样的解释产生了一些新问题,但是,基本上就是这么一回事。
杨永贞
2022/06/08
1.8K0
理解std::move和std::forward
std::jthread与std::thread区别
​std::jthread是C++20新引入的线程类,与 std::thread 类似,或者说,jthread是对thread进一步的封装,功能更强大​。
音视频牛哥
2022/04/03
1.3K0
sprintf函数的使用
学C语言的同学对printf函数都不陌生。从世界上第一个程序(我认为的)"hello world”到你手里正写的某个程序,都少不了printf的影子。不过你也许不知道,printf还有一些兄弟——比如wprintf、sprintf等。
phith0n
2020/10/16
1.4K0
printf(),sprintf() 与 %f
问题1. %m.nf是什么意思? 最笼统的回答是:总共输出 m 位,其中小数占 n 位,右对齐,总计不足 m 位则左端补空格。
Twcat_tree
2022/11/30
1K0
std::atomic和std::mutex区别
​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。​在多线程调用下,利用std::atomic可实现数据结构的无锁设计。​​
音视频牛哥
2022/03/12
2.9K0
std::atomic和std::mutex区别

相似问题

编写c++函数format_string以进行格式化,如std::string的sprintf

49

使用sprintf重用格式字符串

10

用sprintf制作格式字符串

10

Matlab sprintf格式

29

使用sprintf格式化字符串

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档