Как получить следующий токен в Cstring, если я хочу использовать его как int? (C ++) - PullRequest
0 голосов
/ 10 апреля 2010

Моя цель - получать указания от пользователя и, в конечном итоге, текстовый файл для перемещения робота. Уловка в том, что я должен использовать Cstrings (например, char word [];), а не std :: string и токенизировать их для использования.

код выглядит так:

void Navigator::manualDrive()
{

    char uinput[1];
    char delim[] = " ";
    char *token;

    cout << "Enter your directions below: \n";
    cin.ignore();
    cin.getline (uinput, 256);

    token=strtok(uinput, delim);

    if(token == "forward")
    {
        int inches;
        inches=token+1;
        travel(inches);
    }
}

Я никогда не использовал Cstrings, я никогда ничего не маркировал раньше, и я не знаю, как это написать. Наши T.A. ожидают от нас Google и найдут все ответы, потому что они знают, что нас никогда не учили этим методам. У всех в моей лаборатории гораздо больше проблем, чем обычно.

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

1) Спросите дорогу.
2) cin.getline пользовательский ввод
3) токенизировать введенную строку
4) если первое слово токен == «вперед», перейдите к следующему токену и выясните, на сколько дюймов нужно двигаться вперед, затем двигайтесь вперед
5) иначе, если первый токен == «поворот», переходите к следующему токену. если следующий токен == «влево», переходите к следующему токену и узнайте, на сколько градусов повернуть налево

Мне придется сделать это для вперед x, назад x, поворота влево x, поворота вправо x и остановки (где x в дюймах или градусах). Я уже написал функции, которые говорят роботу, как двигаться вперед на дюйм и поворачиваться в градусах. Мне просто нужно знать, как преобразовать введенные строки во все строчные буквы и перейти от токена к токену и преобразовать или извлечь числа из строки, чтобы использовать их как целые числа.

Если не все ясно, вы можете прочитать мою лабораторную работу по этой ссылке: http://www.cs.utk.edu/~cs102/robot_labs/Lab9.html
Если что-то неясно, пожалуйста, дайте мне знать, и я уточню как смогу.

Ответы [ 4 ]

0 голосов
/ 10 апреля 2010

Хотя я не могу ничего сказать о CString, я обнаружил ошибку переполнения стека в вашем коде:

{
    char uinput[1]; // <- Here you define a one byte large buffer on the stack 
    char delim[] = " ";
    char *token;

    cout << "Enter your directions below: \n";
    cin.ignore();
    cin.getline(uinput, 256); // and here you put up to 256 bytes into it

Я бы предложил:

{
    const int bufSize = 42; // since 42 is the awnser to everything
    char uinput[bufSize];
    // ...
    cin.getline(uinput, bufSize);
0 голосов
/ 10 апреля 2010

Чтобы преобразовать строку в нижний регистр, вы можете использовать tolower(). tolower работает с одиночными символами, поэтому вам нужно перебрать всю строку и применить ее к каждому символу.

Чтобы преобразовать строку в число, используйте strtol, strtoul или другие связанные функции.

0 голосов
/ 10 апреля 2010

вы просто снова вызываете strtok, чтобы получить следующий токен.

Возможно, вам понадобятся действительные проверки ввода, т. Е. Проверьте, есть ли следующее значение

обычно вы используете цикл while

1007 * ех *

token=strtok(uinput, delim);
while (token != NULL)
{
   // use token

  //go to next token
   token=strtok(uinput, delim);
}
0 голосов
/ 10 апреля 2010
  1. Чтобы преобразовать в более низкое значение, вы можете использовать tolower . Он работает по одному символу за раз, поэтому вам нужен простой цикл.
  2. Чтобы разобрать строку в целое число, вы можете использовать strtoll .
  3. Переход к следующему токену означает просто повторный вызов strtok (в данном случае внутри оператора if).
...