зарезервированы

я есть следующие данные в строке 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)

Решение Вопроса

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

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

что все данные были отформатированы одинаково, я бы сделал что-то вроде этого

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

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

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

 Martin York12 янв. 2011 г., 17:23
Не используйте _ как это в ваших идентификаторах. Идентификаторы, начинающиеся с_M зарезервированы
 stefaanv12 янв. 2011 г., 17:17
sscanf (текст, "% s", слово); это открытое приглашение для переполнения буфера. Вы действительно должны проверить размер слова в тексте перед вызовом sscanf, что делает его неподходящим.

atoi делает то, что вам нужно

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

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

 skazhy12 янв. 2011 г., 15:10
Я получаю следующую ошибку: не могу преобразовать ‘std :: basic_string <char> ’в« const char * »для аргумента« 1 »в« int atoi (const char *) »
 jk.12 янв. 2011 г., 15:49
в полосе сигналов об ошибках могут быть проблемы. imho Atoi редко бывает полезным из-за этого.
 Zac Howland12 янв. 2011 г., 15:31
@skazhy: Вы должны позвонитьc_str() функцияstring класс при передаче его стандартным функциям C. Возвращает вамconst char*
 Maxpm12 янв. 2011 г., 22:38
Почему отрицательный голос?

Вам нужно использовать

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

или же

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

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

 Martin York12 янв. 2011 г., 17:29
@ Джеймс Годдард: время глазка совершенно бесполезно. Это не будет иметь никакого значения в более широком контексте программы, которая имеет все виды других киосков, которые влияют на время в нем. Способность писать код ортогональности и, следовательно, больше удобства сопровождения имеет гораздо большее значение в долгосрочной перспективе.
 Axel Gneiting12 янв. 2011 г., 14:53
@James: я очень хорошо знаюatoi, но я бы не использовал его в коде C ++.
 DevSolar12 янв. 2011 г., 14:37
Он спросил, как конвертироватьв ква ...
 Axel Gneiting12 янв. 2011 г., 14:52
@DevSolar: Конечно, ты прав. Будет работать и другой путь. Я редактировал пост.
 Axel Gneiting12 янв. 2011 г., 15:43
@James: Я предпочитаю ортогональность и общность, чем использование потенциально более эффективной функции C. Но в прошлый раз я проверил, что они все равно одинаково быстры. Да, компиляторы такие умные в наше время.

Ваш ответ на вопрос