【问题标题】:replacing snprintf with c++ strings用 C++ 字符串替换 snprintf
【发布时间】:2013-12-17 06:17:51
【问题描述】:

我需要用std::string 替换使用snprintf 的C 字符缓冲区并对它们执行相同的操作。我被禁止使用stringstreamboost 库。

有办法吗?

const char *sz="my age is";
std::string s;
s=sz;
s+=100;
printf(" %s \n",s.c_str());

我得到的输出为

my age is d 

要求的输出是:

my age is 100

【问题讨论】:

  • 其实我理解boost case,但是为什么禁止stringstream呢?他们都在 std::
  • stringstream 不是库扩展,它与字符串本身在同一个标​​准库中。
  • 我的意思是库扩展或头文件。字符串流在不同的头文件中,不是吗??

标签: c++ c stdstring printf


【解决方案1】:

这正是 stringstreams 发明的那种工作,因此将它们排除在外似乎相当愚蠢。

不过,是的,没有它们你也可以轻松做到:

std::string s{" my age is "};

s += std::to_string(100);

std::cout << s << " \n";

如果您遇到不支持to_string 的旧编译器,您可以轻松编写自己的编译器:

#include <string>

std::string to_string(unsigned in) { 
    char buffer[32];
    buffer[31] = '\0';
    int pos = 31;

    while (in) {
        buffer[--pos] = in % 10 + '0';
        in /= 10;
    }
    return std::string(buffer+pos);
}

【讨论】:

  • @DominikC:C++11 的使用范围很广,除非指定其他版本,否则我将其视为“C++”的同义词。
  • @Jeffry:谢谢你的帮助。但正如 Dominik 所说,事实证明我这里的编译器太老了,不支持 to_string。
  • @BasavNagar:有关如何编写自己的转换的基本概念,请参阅编辑。
  • @Jeffry:你说得对。我想我现在得自己写转换了。
  • @BasavNagar:stringstreams 做这种“事情”的“实用工具”....不是吗您的要求禁止他们“很奇怪”?
【解决方案2】:

如下编辑您的代码,

const char *sz="my age is";
std::string s{sz};
s+=std::string{" 100"};
std::cout << s << '\n';

您需要将字符串连接到字符串,而不是将整数连接到字符串。
如果年龄在不同的运行中不同,您可以使用sprintf 从中创建一个字符串,然后附加到字符串s

std::string s{" my age is "};
int age = 30;
char t[10] = {0};
sprintf(t, "%d", age);
s += std::string{t};
std::cout << s << '\n';

【讨论】:

  • 是的,这是可行的,也是避免 to_string 的一种方法,因为我的编译器不支持它
  • 这无助于处理数字在编译时值未知的变量中的情况。
  • @TonyD:我编辑了帖子来处理你说的情况。
  • 然后我+1...干杯。 (一般来说,将整个结果snprintf( 放入一个大缓冲区然后从那里构造一次返回字符串可能更容易。
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 2013-04-01
  • 2010-12-06
  • 2013-05-26
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
相关资源
最近更新 更多