首先且仅跳过 cin,即使在使用 cin.ignore 之后也是如此
First & only cin is skipped, even after using cin.ignore
编辑 2:
好吧,原来我只是在装傻!这与代码完全无关。我通过 bash 脚本 运行 一切,并且由于我之前使用它的方式(也不需要任何输入)我仍然 运行 它与 & 最后- 显然我无法从 shell.
获得任何输入
我的程序似乎跳过了我尝试使用 cin 接收输入的行(它直接转到下一行)。
编辑:请查看底部我放置新代码的位置以及发生的情况。
我在这里搜索并用谷歌搜索,我发现了很多问题,人们遇到了同样的问题!据我所知,问题几乎总是遗留的 '\n' - 但 none 的解决方案到目前为止对我有用。这是有问题的代码:
//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。我已经按照其他类似问题的建议添加了 clear 和 ignore,但我仍然遇到同样的问题。
这是我的 main 的开头,所以我没有在这段代码之前做任何其他 cout 或 cin。然而,这是一个更大项目的一部分,我正在使用 ros。在程序到达这部分之前,还有其他输出是通过ros处理的;虽然没有其他输入。
非常感谢你的帮助!我觉得我一定错过了一些非常明显的东西......
编辑:我现在从字面上注释掉了与此输入 不直接相关的所有内容,并将 cin 移到了 main 的最顶部。这是完整的代码(省略了注释部分):
#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
$
只有杀掉程序后才会突然出现输出。这里发生了什么?我很困惑。
我不明白你原来关于跳过一行的问题,但在你关机之前没有打印任何东西的原因是你从输出中遗漏了 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?
好吧,原来我只是在装傻!这与代码完全无关:
我通过 bash 脚本 运行 一切,并且由于我之前使用它的方式(也不需要任何输入)我仍然 运行 它最后是 & - 所以显然我无法从 shell.
获得任何输入
[注意:我不确定回答自己的问题是否是个好习惯;起初我只是编辑它。但我认为这比让它打开更有意义。]
编辑 2:
好吧,原来我只是在装傻!这与代码完全无关。我通过 bash 脚本 运行 一切,并且由于我之前使用它的方式(也不需要任何输入)我仍然 运行 它与 & 最后- 显然我无法从 shell.
获得任何输入我的程序似乎跳过了我尝试使用 cin 接收输入的行(它直接转到下一行)。
编辑:请查看底部我放置新代码的位置以及发生的情况。
我在这里搜索并用谷歌搜索,我发现了很多问题,人们遇到了同样的问题!据我所知,问题几乎总是遗留的 '\n' - 但 none 的解决方案到目前为止对我有用。这是有问题的代码:
//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。我已经按照其他类似问题的建议添加了 clear 和 ignore,但我仍然遇到同样的问题。
这是我的 main 的开头,所以我没有在这段代码之前做任何其他 cout 或 cin。然而,这是一个更大项目的一部分,我正在使用 ros。在程序到达这部分之前,还有其他输出是通过ros处理的;虽然没有其他输入。
非常感谢你的帮助!我觉得我一定错过了一些非常明显的东西......
编辑:我现在从字面上注释掉了与此输入 不直接相关的所有内容,并将 cin 移到了 main 的最顶部。这是完整的代码(省略了注释部分):
#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
$
只有杀掉程序后才会突然出现输出。这里发生了什么?我很困惑。
我不明白你原来关于跳过一行的问题,但在你关机之前没有打印任何东西的原因是你从输出中遗漏了 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?
好吧,原来我只是在装傻!这与代码完全无关:
我通过 bash 脚本 运行 一切,并且由于我之前使用它的方式(也不需要任何输入)我仍然 运行 它最后是 & - 所以显然我无法从 shell.
获得任何输入[注意:我不确定回答自己的问题是否是个好习惯;起初我只是编辑它。但我认为这比让它打开更有意义。]