Разобрать строковый поток на строки и двойники

Я пишу программу, которая принимает входные данные в одну строку следующим образом:

Прогон 10,1 50,2

Где «Выполнить» — это строка, а остальная часть строки — двойная. Экспоненциальная запись и отрицательные числа также могут использоваться как двойные входные данные: например, -5.88e-11 (стандартная библиотека C++ допускает это).

Вот исходный код, который я пробовал.

string command; 
double input1; 
double input2; 
getline(cin,input);
stringstream ss(input);

ss >> command >> input1 >> input2;

Проблема с этим подходом заключается в том, что если вместо двойного числа вводится пробел или буква, вывод строкового потока будет 0. Я полагаю, что это связано с тем, что в C++ нет нулевых держателей для двойного числа.

Другой подход, который я пробовал, заключается в том, чтобы читать каждый ввод как строку, проверять, является ли строка числовой, и преобразовывать ее в двойную. Однако это усложняется, когда можно вводить научные обозначения и отрицания. Попробуйте это:

for (int i=0; input1[i]; i++){
    if (isdigit(input1[i])){\
        isDigit = true;
    }else{
        isDigit = false;
    }
}

Как я могу проанализировать этот ввод со строкой и буквенно-цифровыми двойниками в одной строке? (при сохранении негативов и научных обозначений)

Спасибо!


person 0000101010    schedule 15.10.2015    source источник
comment
С каким примером ввода у вас возникли проблемы?   -  person Vaughn Cato    schedule 15.10.2015
comment
Что вы хотите, чтобы код был, если ему дали Run abc 50.2?   -  person Beta    schedule 15.10.2015
comment
Если ввод: Запустите abc 50.2 input1 (двойной) из строкового потока будет 0. Вероятно, это связано с тем, что abc не является допустимым двойным. Я ищу способ проверить, что двойник из строкового потока на самом деле является двойным.   -  person 0000101010    schedule 15.10.2015
comment
Другим примером ввода является Run 50.2, в котором input1 заменен пробелом. Произойдет тот же результат, и input1 (double) будет установлен на 0.   -  person 0000101010    schedule 15.10.2015
comment
Почему бы не сделать cin >> command >> input1 >> input2;? Может избавить вас от некоторых проблем.   -  person xiaofeng.li    schedule 15.10.2015
comment
cin не решает проблему, так как любой ввод, который не является строго двойным (например, abc, пробел), будет прочитан как 0. Мне все еще нужно сохранить 0 в качестве входных данных. Я подумал, что через stringstream может быть способ более легко разобрать его.   -  person 0000101010    schedule 15.10.2015


Ответы (1)


Использование std::cin напрямую и проверка наличия ошибок при анализе потока.

std::string command;
double arg1, arg2;

if (std::cin >> command >> arg1 >> arg2) {
    std::cout << command << std::endl;
    std::cout << arg1 << std::endl;
    std::cout << arg2 << std::endl;
} else {
    // error!
}
person xiaofeng.li    schedule 15.10.2015