Я создал программу для получения ввода строки от пользователя, его разбора на токены и перемещения робота в соответствии с вводом. Предполагается, что программа распознает следующие входные данные (где x - целое число): «вперед x», «назад x», «поворот влево x», «поворот вправо x» и «остановка». Программа делает то, что должна делать для всех команд, кроме «стоп». Когда я набираю «стоп», программа выводит «что происходит?» потому что я написал строку, в которой говорится:
if(token == NULL)
{
cout << "whats happening?" << endl;
}
Почему токен получает значение NULL и как я могу это исправить, чтобы он правильно читал «стоп»?
вот код:
bool stopper = 0;
void Navigator::manualDrive()
{
VideoStream video(&myRobot, 0);//allows user to see what robot sees
video.startStream();
const int bufSize = 42;
char uinput[bufSize];
char delim[] = " ";
char *token;
while(stopper == 0)
{
cout << "Enter your directions below: " << endl;
cin.getline(uinput,bufSize);
Navigator::parseInstruction(uinput);
}
}
/* parseInstruction(char *c) -- parses cstring instructions received
* and moves robot accordingly
*/
void Navigator::parseInstruction(char * uinput)
{
char delim[] = " ";
char *token;
// cout << "Enter your directions below: " << endl;
// cin.getline (uinput, bufSize);
token=strtok(uinput, delim);
if(token == NULL)
{
cout << "whats happening?" << endl;
}
if(strcmp("forward", token) == 0)
{
int inches;
token = strtok(NULL, delim);
inches = atoi (token);
double value = fabs(0.0735 * fabs(inches) - 0.0550);
myRobot.forward(1, value);
}
else 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*/);
}
else 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.00467 * degrees - 0.04);
myRobot.turnLeft(1/*speed*/, value/*time*/);
}
else if(strcmp("right",token) == 0)
{
token = strtok(uinput, delim);
degrees = atoi (token);
double value = fabs(0.00467 * degrees - 0.04);
myRobot.turnRight(1/*speed*/, value/*time*/);
}
}
else if(strcmp("stop",token) == 0)
{
stopper = 1;
}
else
{
std::cerr << "Unknown command '" << token << "'\n";
}
}
/* autoDrive() -- reads in file from ifstream, parses
* and moves robot according to instructions in file
*/
void Navigator::autoDrive(string filename)
{
const int bufSize = 42;
char fLine[bufSize];
ifstream infile;
infile.open("autodrive.txt", fstream::in);
while (!infile.eof())
{
infile.getline(fLine, bufSize);
Navigator::parseInstruction(fLine);
}
infile.close();
}
Мне нужно это, чтобы вырваться из цикла while и завершить manualDrive, потому что в моей программе драйвера следующая функция называется autoDrive.
файл autodrive.txt выглядит так:
вперед 2
повернуть направо 30
назад 3
повернуть налево 50
остановка
Также я пропустил важное ограничение в моей программе, мне не разрешается использовать строки из стандартной библиотеки