增加字符串中的数字

时间:2012-02-16 10:28:25

标签: c++ stdstring leveldb

我必须将增加的ID作为密钥保存到levelDB数据库中。所以我得到的(以及我必须给予levelDB的是)一个字符串。

问题:是否有一种优雅的方式来增加字符串中保存的数字?

示例:

std::string key = "123";
[..fancy code snipped to increase key by 1..]
std::cout << key << std::endl;  // yields 124

干杯!

PS:更愿意继续使用标准编译,即没有C ++ 11。

5 个答案:

答案 0 :(得分:3)

#include <sstream>
std::string key = "123";
std::istringstream in(key);
int int_key;
in >> int_key;
int_key++;
std::ostringstream out;
out << int_key;
key = out.str();
std::cout << key << std::endl;

您也可以使用c样式转换:

std::string key = "123";
int int_key = atoi(key.c_str());
int_key++;
char key_char[20];
itoa(int_key, key_char, 10);
key = key_char;
cout << key << endl;

答案 1 :(得分:2)

您总是可以编写一个小例程来执行基数10算术,但最简单的解决方案通常是将数字保持为int(或其他一些整数类型),并根据需要将其转换为字符串。

答案 2 :(得分:1)

也许是这样的:

std::string key = "123";
std::stringstream out;
out << (atoi(key.c_str()) + 1);
key = out.str();

答案 3 :(得分:0)

代码:

istringstream iss(key);
int ikey;
iss >> ikey;
ostringstream oss;
oss << (ikey+1);
key = oss.str();

答案 4 :(得分:0)

啊,leveldb确实接受了字符串并且它可以返回一个字符串,但是 Slice结构也有一个带有不透明数据数组的构造函数:

// Create a slice that refers to data[0,n-1].
Slice(const char* data, size_t n)

当您获得密钥Slice时,您仍然有char*作为数据,因此您不必为字符串烦恼:

// Return a pointer to the beginning of the referenced data
const char* data() const { return data_; }

如果您的整个目标是使用整数作为键,那么只需将整数转换为char *并将其存储在leveldb中,如下所示:

int oldKey = 123;
char key[8];
memset(key, 0, 8);

*(int*)(&key) = oldKey;
*(int*)(&key) += 1;

// key is now 124

// want to put it back in a slice? 
Slice s(key, sizeof(int));

不需要烦人而昂贵的琴弦......