2016-09-14 3 views
-1

Edit 2:Первый и только CIN пропускается, даже после использования cin.ignore

Ну, получается, я просто был глуп! Это вовсе не было связано с кодом. Я запускал все с помощью сценария bash, и из-за того, как я использовал его раньше (что также не требовало ввода), я все еще запускал его с & в конце - поэтому, очевидно, я не мог получить никакого ввода от этого оболочка.


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

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

Я искал здесь и искал в google, и я нашел много вопросов, где у людей была такая же проблема! Насколько я понимаю, проблема почти всегда оставалась «\ n», но ни одно из решений не работало для меня. Это проблемный код:

//char input_char; 
std::string input_string; 
//int input_int; 

//std::string line; 

std::cout << "hello. your input: "; 

std::cin.clear(); 
std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 

std::cin >> input_string; 
// std::getline(std::cin, input_string); 

std::cout << "input: " << input_int << endl; 

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

Это в начале моего основного, поэтому я не делаю никаких других cout или cin перед этим кодом. Однако это часть более крупного проекта, и я использую ros. Перед тем, как программа доберется до этой части, есть другие выходы, которые обрабатываются через ros; ни одного другого ввода.

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

Редактировать: Я теперь прокомментировал буквально все, что не связано непосредственно с этим вводом, и переместил cin на самую верхнюю часть основного. Теперь это полный код (комментируемые части опущены):

#include <iostream> 
#include <ros/ros.h> 
#include <vector> 
#include <ros/console.h> 
#include "std_msgs/String.h" 

//#include <SharedMessages/MicroconRequest.h> 

/* ... */ 

//ros::Publisher reqPublisher; 
//SharedMessages::MicroconRequest reqMsg; 


/* ... */ 

int main(int argc, char* argv[]) 
{ 

    char input_test; 
    std::cout << "character: "; 
    std::cin >> input_test; 
    std::cout << input_test; 
    std::cout << "did that work?"; 

    // Handle ROS communication 
    ros::init(argc, argv, "Gestures"); 
    ros::NodeHandle n; 

    //ros::Subscriber joy_sub_ = n.subscribe<sensor_msgs::Joy>("joy", 10, joyCallback, this); 
    //reqPublisher = n.advertise<SharedMessages::MicroconRequest>("MicroconRequest", 10); 

    ros::Rate loop_rate(10); 

    // Infinite control loop 
    while (ros::ok()) 
    { 

     /* ... */ 

     cntLoop++; 

     ros::spinOnce(); 
     loop_rate.sleep(); 
    } 

    // turn off microcontroller 
    return 0; 
} 

Теперь то, что происходит, является следующим:

$ ./startDemo.bash 

Starting Minimal Example 

$ character: a    # now I have time to input something, but... 
a: Befehl nicht gefunden.  # = command not found] 
           # then it doesn't do anything, so I stop it 
$ ./stopDemo.bash 
killing /Gestures 

did that work?[ WARN] [1473954737.268901991]: Shutdown request received. 
[ WARN] [1473954737.268978735]: Reason given for shutdown: [user request] 
killed 
$ 

Только после убийства программы делает внезапно появляется на выходе. Что здесь происходит? Я весьма озадачен.

+0

Вы не хотите, чтобы 'ignore' вообще ...' clear' тоже бессмысленно в начале. – LogicStuff

+0

use cin.sync() достаточно – Raindrop7

+0

Спасибо за ваш вклад! Я только добавил их, потому что это был единственный совет, который я мог найти по аналогичным проблемам, надеясь, что это может помочь. Я пробовал cin.sync(), но, к сожалению, это ничего не меняет. –

ответ

0

Ну, получается, я просто был глуп! Это совсем не было связано с кодом:

Я запускал все через скрипт bash, и из-за того, как я использовал его раньше (который также не требовал ввода), я все еще запускал его с & в конце - поэтому, очевидно, я не мог получить никакого ввода от этой оболочки.

[Примечание: я не был уверен, было ли хорошей практикой отвечать на собственный вопрос; сначала я только что отредактировал его. Но я решил, что это будет иметь больше смысла, чем просто оставить его открытым.]

0

Я не понимаю ваш первоначальный вопрос о пропуске строки, но причина ничего не печатается до тех пор, пока вы не выключите то, что вам не хватает endl с выхода. Я добавил его, и результат кажется таким, каким вы ожидали?

char input_test; 
std::cout << "character: "; 
std::cin >> input_test; 
std::cout << input_test; 
std::cout << "did that work?" << std::endl; 

Выход:

[email protected]:/catkin_ws/devel/lib/stack# ./stack_node 
character: a 
adid that work? 
+0

Привет, спасибо за вашу помощь! Первоначально проблема заключалась в том, что у меня не было возможности ввести что-либо, оно сразу же перейдет к следующей строке кода. Позже проблема заключалась в том, что у меня было время что-то ввести, но это будет интерпретироваться как команда терминала, говоря мне «Befehl nicht gefunden» = «Command not found». Тем не менее, я в конечном итоге смог его решить - это не проблема с кодом, потому что из-за сценария bash я использовал его для начала ... Я просто был очень глупым. –

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