Как мне получить следующий токен в Cstring, если я хочу использовать его как int? (С++)

Моя цель — получить указания от пользователя и, в конечном итоге, текстовый файл для перемещения робота. Загвоздка в том, что я должен использовать 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, никогда раньше ничего не токенизировал, и я не знаю, как это написать. Наши ассистенты ожидают, что мы погуглим и найдем все ответы, потому что они знают, что нас никогда не учили этим методам. У всех в моей лаборатории гораздо больше проблем, чем обычно.

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

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

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

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


person Van    schedule 10.04.2010    source источник
comment
Так это действительно вопрос C?   -  person ben    schedule 10.04.2010
comment
Джеймс, прочитай всю страницу. Вы будете использовать cstrings и сопровождающую их библиотеку. [...] Вы можете использовать что угодно, кроме строковых методов С++, чтобы решить эту проблему. Библиотека строк C++ недоступна.   -  person Matthew Flaschen    schedule 10.04.2010
comment
Я просто хотел бы поблагодарить всех, кто ответил немедленно. Я не ожидал, что моя проблема будет решена так быстро. Еще раз спасибо всем, и мой вопрос был дан ответ. Я скоро зарегистрируюсь и войду, чтобы оценить ответы.   -  person Van    schedule 10.04.2010


Ответы (4)


  1. Чтобы преобразовать в более низкий, вы можете использовать tolower. Он работает с одним символом за раз, поэтому вам нужен простой цикл.
  2. Чтобы преобразовать строку в целое число, вы можете использовать strtoll.
  3. Переход к следующему токену просто означает повторный вызов strtok (в данном случае внутри оператор если).
person Matthew Flaschen    schedule 10.04.2010

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

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

person JSBձոգչ    schedule 10.04.2010

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

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

обычно вы использовали бы цикл while

ex

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

  //go to next token
   token=strtok(uinput, delim);
}
person Holograham    schedule 10.04.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);
person Rudi    schedule 10.04.2010
comment
и я соблазнился намеком на «Автостопом по Галактике». - person Van; 10.04.2010