Как я могу токенизировать ввод массива символов в символ и строку? - PullRequest
2 голосов
/ 02 мая 2019

Я пытаюсь попросить пользователя ввести, скажем, 3 символа.Я хочу отделить первого и двух последних персонажей друг от друга.Так что, если «A13» является пользовательским вводом, я хочу сохранить «A» в отдельном символе и «13» в отдельном символе [].

//initializations
char seatName[4], seatRowName, seatNumber[3];

printf("\n\nPick a seat (Row Seat) ");
scanf("%s", seatName);
seatRowName=seatName[0];
seatNumber=strchr(seatName, seatRowName);
//I get the "error: incompatible types in assignment" on the above line

Пример вывода:

Выбор места (сиденье в ряд): A13
// seatRowName = A, seatNumber = 13

1 Ответ

2 голосов
/ 02 мая 2019

Используйте код ниже:

seatRowName=seatName[0];
strcpy(seatNumber, &seatName[1]);  // strncpy if you want to be safe

Если вы никогда не измените seatName, вы также можете использовать const char *seatNumber = &seatName[1];


Почему это работает:

             +0  +1  +2  +3
            +---+---+---+---+
   seatName | A | 1 | 3 | \0|
            +---+---+---+---+
             [0] [1] [2] [3]

В памяти seatName хранит содержимое в непрерывном пространстве.Этот подход будет хорошо работать даже для таких входных данных, как A3.Вы должны предоставить другие проверки работоспособности для ввода.

seatNumber=strchr(seatName, seatRowName);

Я получаю "ошибку: несовместимые типы в присваивании" в строке выше

strchr возвращает char * и тип seatNumber равен char [3].Поскольку типы RHS и LHS различны, вы получаете ошибку выше.В отличие от многих популярных языков C этого не позволяет.

Назначение яблок апельсинам почти всегда некорректно.strcpy(A, B); вместо A = B будет работать в этом случае.

...