Преобразование строки c ++ в int - PullRequest
3 голосов
/ 12 января 2011

У меня есть следующие данные в строке c ++

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’. Когда я извлекаю часть «Джон Доу» из другой строковой переменной, все работает нормально. В чем дело?

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

Ответы [ 5 ]

5 голосов
/ 12 января 2011

Вам необходимо использовать

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

или

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

Последний - это удобная оболочка из библиотеки наддува.

3 голосов
/ 12 января 2011

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

#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";
}

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

2 голосов
/ 12 января 2011

Попробуйте библиотеку Boost Data / Time .

1 голос
/ 12 января 2011

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

"Анализирует строку C str, интерпретируя ее содержимое как целое число, которое возвращается как значение типа int."

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

0 голосов
/ 12 января 2011

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

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 );

Однако, это имеет проблему, что имена / фамилиив вашем входе есть только одно слово (т.е. это не сработает для таких вещей, как «Джон М. Доу»).Вам также необходимо определить некоторую подходящую максимальную длину для строки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...