2012-02-16 2 views
2

Мне нужно сохранить увеличивающийся идентификатор в качестве ключа в базу данных уровня. Так что я получаю (и то, что я должен дать levelDB), это строка.увеличить число в строке

Вопрос: Есть ли элегантный способ увеличить число, сохраненное в строке?

Пример:

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

Ура!

PS: Предпочитаете остановиться со стандартной компиляцией, то есть нет C++ 11.

+0

вы уверены, что значение не 124? –

+0

@izomorphius: typo .. спасибо .. это от 123 до 124 – ezdazuzena

+0

Итак, ваш ключ на самом деле 123, а не ваша ценность? Что происходит с вашим старым ключом? – Kiril

ответ

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; 

Вы также можете сделать это с помощью литья с стиль:

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; 
+0

может быть, что itoa не является стандартным C++ .. похоже, что он не поддерживается g ++ – ezdazuzena

+0

hmmm Я на 99% уверен, что он поддерживается g ++. Попробуйте включить cstdlib –

+0

nope .. не работает – ezdazuzena

1

Возможно, что-то вроде этого:

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

Код:

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

Вы всегда можете написать небольшую процедуру, чтобы сделать основание 10 арифметику, но самое простое решение, как правило, чтобы сохранить число как int (или какой-либо другой интегральный тип) и преобразовать его в строку по мере необходимости.

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_; } 

Если вся ваша цель состоит в том, чтобы иметь целое число в качестве ключа, а затем просто преобразовать целое число в символ * и магазин это в 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)); 

нет необходимости в надоедливых и дорогих струн ...

+0

error: cast from 'char *' to 'int' теряет точность :((в 'key = (char *) (((int) key) +1);') – ezdazuzena

+0

@ezdazuzena Я не получив ошибку, вот компилированная версия gcc-4.3.4: http://ideone.com/W3NQ2 Я также скомпилировал тот же код в VS 2010 (как 32-разрядные, так и 64-разрядные платформы). Как вы компилировать его? – Kiril

+0

gcc версия 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) – ezdazuzena

Смежные вопросы