在C++中将uint64转换为字符串

6

将 uint64 值转换为标准 C++ 字符串的最简单方式是什么?我查看了字符串的 assign 方法,但没有找到可以接受 uint64(8 字节)作为参数的方法。

我该怎么做呢?

谢谢。

7个回答

13

标准方法:

std::string uint64_to_string( uint64 value ) {
    std::ostringstream os;
    os << value;
    return os.str();
}

如果您需要一种优化的方法,那么可以使用这个:

void uint64_to_string( uint64 value, std::string& result ) {
    result.clear();
    result.reserve( 20 ); // max. 20 digits possible
    uint64 q = value;
    do {
        result += "0123456789"[ q % 10 ];
        q /= 10;
    } while ( q );
    std::reverse( result.begin(), result.end() );
}

11
#include <sstream>

std::ostringstream oss;
uint64 i;
oss << i;
std:string intAsString(oss.str());

9
比起流,我认为更加具有描述性的是lexical_cast
uint64 somevalue;
string result = boost::lexical_cast<string>(somevalue);

1
他提到了标准的C++,所以我认为他的意思是STL。不过,总的来说,Boost也是个好主意。 - Randolpho
标准的C++字符串可以指Char*字符串,<string>字符串,或者如果他是Windows程序员,则是CString或System::String。:-S 可用的字符串太多了! :-D - Caladain
你是对的Randolpho,我是指STL。在这种情况下我没有使用Boost。不管怎样,谢谢你的评论Greg。 - Bilthon
2
在我看来,指出适用的Boost相当重要,因为很多人浪费时间去重新发明已经存在的 Boost,而这些人可能并不知道它。即使他们知道,也值得指出他们正在浪费时间……再次浪费。Boost不仅是标准的C++,而且作者确保它甚至可以在不符合标准(几乎所有)的编译器上工作。在大多数需要 Boost 的情况下,你将根本找不到更好的替代方案。 - Edward Strange
好的,我错了,我把它当作“标准C++字符串”而不是全面的“标准C++”,尽管哪个标准是进一步的问题。无论如何,lexical_cast“只是”使用stringstream更漂亮的形式,将其卷成一个命名函数有助于可读性。 - Greg Domjan

5

C++11标准化了Frunsi提到的to_string函数,现在它被称为std::to_string

#include <string>

int main()
{
  uint64_t value = 128;
  std::string asString = std::to_string(value);
  return 0;
}

4

我不喜欢这种回答。你能为这个具体的问题提供更多的描述和/或一些示例代码吗? - lornova

4

C++:使用stringstream

C:sprintf(buffer, "%I64ld", myint64);


C语言的变体从哪里来?我所知道的标准inttypes的方法是sprintf(buffer,PRId64,myint64); - Dummy00001

-1
std::string converted(reinterpret_cast<char*>(&my_int64),
                      reinterpret_cast<char*>((&my_int64)+1));

虽然这在技术上是将uint64转换为字符串,但这绝对不是OP想要的。如果是这样,他会说“如何将我的uint64的8个组成字节转换为它们的ASCII等效字符并放入一个字符串中?”或类似的内容。 - A. Levy
这个应该不被否定。这是唯一一个真正回答问题的答案。OP没有问如何创建uint64中值的字符串表示形式。 - Edward Strange
@Levy - 实际上,OP特别提到了字节大小,并抱怨uint64没有assign()。std::string中的每个其他assign都执行直接字节赋值;不进行任何解释。 - Edward Strange
抱歉没有明确说明,但A.Levy是正确的。我想要的是将数字的值取出并创建一个表示相同数字的字符串。我只是不想将其强制转换为常规int并使用sprintf,因为这样我会失去一半的字节值,在某些情况下可能会得到错误的值。 - Bilthon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接