2016-05-14 2 views
-3

Итак, у меня есть следующая проблема, я попытался вставить две строки, один из них может быть нулевым. Я пробовал сcin/getline в одной строке в консольном приложении

cin>> param1>>param2 

Отметьте, что param1 не может быть нулевым параметром 2 может быть нулевым. Не работает, если param2 равно null.

Далее я попытался с getline(cin,param1) и getline(cin,param2) это работает, но мне нужно предоставить параметры в двух строках в консольном приложении.

Мне нужно прочитать с панели param1, param2 в одной строке. Обратите внимание, что я начинаю с этого языка программирования.

Благодаря

+0

Почему вы говорите, «Так у меня есть следующая проблема» в каждом из ваших вопросов? Как это относится к любому из вопросов? –

ответ

1

Да, это не работает, потому что cin затем ждет второго параметра. Вам нужно будет использовать getline() и проанализировать строку вручную.

Одна возможность сделать это:

string params, param1, param2; 
getline(cin, params); 
istringstream str(params); 
str >> param1 >> param2; 

Обратите внимание, что param2 будет пустым, то если только один парам передается, потому что stringstream концы (КИН не заканчивается).

Это, как говорится, это будет по-прежнему не работает в тех случаях, как "parameter 1 with spaces" "parameter 2 with spaces" потому IStream просто расщепляется на пространствах и не обрабатывает кавычки.

Обычно, когда приложение требует параметры, argc и argv аргументов main() используются, чтобы получить их из командной строки приложения (где процитировать также работает)

2

cin для чтения, поэтому направление потока является обратным:

cin >> param1 >> param2; 
+0

Я изменил, извините, я спешил – lolex

1

cin является моделью std::istream. При любом исходе результат stream >> x является ссылкой на сам istream.

istream содержит несколько флагов, указывающих на успех или неудачу предыдущих операций.

istream также конвертируется в bool. Значение bool будет true, если предыдущие операции были успешными и false в противном случае (по какой-либо причине).

Таким образом, если мы желаем, мы можем связать не только операции >>, но и другие проверки.

Это может быть немного продвинутым, но я думаю, вы найдете это интересным. Вы можете скомпилировать и запустить эту программу как есть.

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


struct success_marker 
{ 
    success_marker(bool& b) 
    : _bool_to_mark(std::addressof(b)) 
    {} 

    void mark(bool value) const { 
     *_bool_to_mark = value; 
    } 
    bool* _bool_to_mark; 
}; 

std::istream& operator>>(std::istream& is, success_marker marker) 
{ 
    marker.mark(bool(is)); 
    return is; 
} 

success_marker mark_success(bool& b) { 
    return success_marker(b); 
} 

void test(const std::string& test_name, std::istream& input) 
{ 
    bool have_a = false, have_b = false; 
    std::string a, b; 

    input >> std::quoted(a) >> mark_success(have_a) >> std::quoted(b) >> mark_success(have_b); 

    std::cout << test_name << std::endl; 
    std::cout << std::string(test_name.length(), '=') << std::endl; 
    std::cout << have_a << " : " << a << std::endl; 
    std::cout << have_b << " : " << b << std::endl; 
    std::cout << std::endl; 
} 

int main() 
{ 
    std::istringstream input("\"we have an a but no b\""); 
    test("just a", input); 

    // reset any error state so the stream can be re-used 
    // for another test 
    input.clear(); 

    // put new data in the stream 
    input.str("\"the cat sat on\" \"the splendid mat\""); 
    // test again 
    test("both a and b", input); 

    return 0; 
} 

ожидается выход:

just a 
====== 
1 : we have an a but no b 
0 : 

both a and b 
============ 
1 : the cat sat on 
1 : the splendid mat 
Смежные вопросы