我编写了一个程序来获取用户的字符串输入并将其解析为标记并根据输入移动机器人。我的问题是尝试发出多个命令。代码如下:
void Navigator::manualDrive()
{
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
while(true)
{
Navigator::parseInstruction(uinput);
}
}
/* parseInstruction(char *c) -- parses cstring instructions received
* and moves robot accordingly
*/
void Navigator::parseInstruction(char * c)
{
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
cout << "Enter your directions below: \n";
cin.ignore();
cin.getline (uinput, bufSize);
token=strtok(uinput, delim);
if(strcmp("forward", token) == 0)
{
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
Navigator::travel(inches);
}
if(strcmp("back",token) == 0)
{
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
double value = fabs(0.0735 * fabs(inches) - 0.0550);
myRobot.backward(1/*speed*/, value/*time*/);
}
if(strcmp("turn",token) == 0)
{
int degrees;
token = strtok(NULL, delim);
if(strcmp("left",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.0041 * degrees - 0.0523);
myRobot.turnLeft(1/*speed*/, value/*time*/);
}
}
if(strcmp("turn",token) == 0)
{
int degrees;
token = strtok(NULL, delim);
if(strcmp("right",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.0041 * degrees - 0.0523);
myRobot.turnRight(1/*speed*/, value/*time*/);
}
}
if(strcmp("stop",token) == 0)
{
myRobot.motors(0,0);
}
}
在函数manualDrive中,我有一个while循环无限地调用函数parseInstruction。程序输出“在下面输入您的指示:”当我给出程序指令时,它会执行它们,然后再次输出“在下面输入您的指示:”当我再次输入我的指示时它不执行它们并输出“输入您的指示”下面:“相反。我确信这是一个非常简单的修复,我只是对c ++很新。所以,如果你能帮助我,请告诉我为什么程序只采取第一组指示。感谢
答案 0 :(得分:1)
这听起来像是当你的cin命令从上一个输入读入新行字符时发生的常见问题。我看到你有cin.ignore(),这通常是解决这个问题的方法,但它仍然会发生。
尝试在getline()命令
之后将忽略移动到答案 1 :(得分:1)
这里不应该有cin.ignore()
行。 cin.getline
应该已经提取并丢弃分隔符。我怀疑它丢掉了你命令的第一个字符。您可以通过将if语句更改为else-ifs并在末尾添加else块来检查:
if(strcmp("forward", token) == 0)
else if(strcmp("back",token) == 0)
else if(strcmp("turn",token) == 0)
else if(strcmp("turn",token) == 0)
else if(strcmp("stop",token) == 0)
else
{
std::cerr << "Unknown command '" << token << "'\n";
}
答案 2 :(得分:0)
我相信你的多个if语句都是原因的一部分,同时误读命令。我也会使用endl而不是使用/ n char。这样做意味着您不需要忽略。
void Navigator::manualDrive()
{
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
while(true)
{
Navigator::parseInstruction(uinput);
}
}
/* parseInstruction(char *c) -- parses cstring instructions received
* and moves robot accordingly
*/
void Navigator::parseInstruction(char * c)
{
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
cout << "Enter your directions below: " << endl;
cin.getline (uinput, bufSize);
token=strtok(uinput, delim);
switch(token[3])//the command's fourth letter
//needed letter because strings don't work with switch
{
case 'w': //forward
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
Navigator::travel(inches);
break;//this signifies the end of the case
case 'k': //back
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
double value = fabs(0.0735 * fabs(inches) - 0.0550);
myRobot.backward(1/*speed*/, value/*time*/);
break;
case 'n': //turn
int degrees;
token = strtok(NULL, delim);
if(strcmp("left",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.0041 * degrees - 0.0523);
myRobot.turnLeft(1/*speed*/, value/*time*/);
}
else if(strcmp("right",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.0041 * degrees - 0.0523);
myRobot.turnRight(1/*speed*/, value/*time*/);
}
break;
case 'p': //stop
myRobot.motors(0,0);
break;
default: //the default case
cout << "Command Unknown" << endl;
break;
}
}