2011-01-12 4 views
3

У меня есть следующие данных в C++ строкиПреобразования C++ строки INT

John Doe 01.01.1970 

Мне нужно извлечь дату и время из него в Int переменных. Я пробовал так:

int last_space = text_string.find_last_of(' '); 
int day = int(text_string.substr(last_space + 1, 2)); 

Но я invalid cast from type ‘std::basic_string’ to type ‘int’. Когда я извлекаю часть «John Doe» в другой строковой переменной, все работает нормально. Что не так?

Я пытаюсь скомпилировать его с g ++ -Wall -Werror.

ответ

3

Использования потоков для декодирования целых чисел из строки:

#include <iostream> 
#include <sstream> 
#include <string> 

int main() 
{ 
    std::string   x = "John Doe 02.01.1970"; 

    std::string   fname; 
    std::string   lname; 
    int     day; 
    int     month; 
    int     year; 
    char    sep; 

    std::stringstream data(x); 
    data >> fname >> lname >> day >> sep >> month >> sep >> year; 

    std::cout << "Day(" << day << ") Month(" << month << ") Year(" << year << ")\n"; 
} 

Оператор >> при использовании переменной строки прочтет один (белое) пространства отдельного слова. При использовании с целочисленной переменной будет считываться целое число из потока (отбрасывание любого исходящего (белого) пространства).

5

Вы должны использовать

std::stringstream ss; 
ss << stringVar; 
ss >> intVar; 

или

intVar = boost::lexical_cast<int>(stringVar);.

Более поздняя версия представляет собой удобную обертку из библиотеки boost.

+3

Он спросил, как конвертировать ** в ** int ... – DevSolar

+0

@DevSolar: Конечно, вы правы. Будет работать и наоборот. Я редактировал сообщение. –

+1

@James: Я очень хорошо знаю 'atoi', но я бы не использовал его в коде на C++. –

1

Насколько я могу судить, atoi делает то, что вам нужно.

«Разбирает строчную строчку C, интерпретируя ее содержимое как целое число, которое возвращается как значение int».

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

+0

Я получаю следующую ошибку: невозможно преобразовать 'std :: basic_string ' в 'const char *' для аргумента '1' to 'int atoi (const char *)' – skazhy

+1

@skazhy: Вы должны вызвать 'c_str() 'функции класса' string' при передаче его в стандартные функции C. Он возвращает вам сообщение 'const char *' –

+0

в диапазоне от ошибок. Из-за этого имхо полезно. –

0

Предполагая, что (и это может быть плохим предположение), что все данные были отформатированы так же, я хотел бы сделать что-то вроде этого

char name[_MAX_NAME_LENTGH], last[_MAX_NAME_LENGTH]; 
int month, day, year; 

sscanf(text_string, "%s %s %2d.%02d.%04d", first, last, &month, &day, &year); 

Это, однако, есть проблема, что первые/фамилии, которые появляются на вашем входе, - это только одно слово (т.е. это не работает для таких вещей, как «John M. Doe»). Вам также необходимо определить некоторую соответствующую максимальную длину для строки.

Трудно быть более решительным в отношении этого решения, если мы не знаем больше о вводе.

+0

sscanf (текст, «% s», слово); это открытое приглашение для переполнения буфера. Вы действительно должны проверить размер слова в тексте перед вызовом sscanf, что делает его непригодным. – stefaanv

+0

Не используйте _ в идентификаторах. Идентификаторы, начинающиеся с '_M', зарезервированы. –

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