第一&即使在使用cin.ignore

时间:2016-09-14 12:41:28

标签: c++ input cin ros

编辑2:

好吧,事实证明我只是愚蠢!它与代码根本没有任何关系。我通过bash脚本运行所有内容,并且因为我之前使用它(它也不需要任何输入)我仍然使用&运行它。最后 - 显然我无法从那个shell获得任何输入。

如果我尝试使用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;

我只需要一个字符或数字。我用字符,整数或字符串尝试过它;我已经尝试过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
$ 

只有在杀死程序后才会突然出现输出。这里发生了什么?我很困惑。

2 个答案:

答案 0 :(得分:0)

我不明白您关于跳过一行的原始问题,但是在您关闭之前没有打印任何内容的原因是您错过了输出中的endl。我添加了它,输出看起来像你期望的那样?

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

输出:

root@93043381199d:/catkin_ws/devel/lib/stack# ./stack_node 
character: a
adid that work?

答案 1 :(得分:0)

好吧,事实证明我只是愚蠢!这根本与代码无关:

我通过bash脚本运行所有内容,并且因为我之前使用它(也不需要任何输入),我仍然在最后使用&amp; 运行它 - 很明显我无法从那个shell获得任何输入。

[注意:我不确定回答一个人自己的问题是否是一种好习惯;起初我刚刚编辑过它。但我觉得它比让它保持开放更有意义。]