В некотором контексте моя игра запускается в терминале и похожа на игру типа командной строки. На данный момент для обработки команд используется strcmp() для каждой отдельной команды, что не очень красиво и неэффективно. Из-за этого я решил, что надо переделать. Я попробовал просмотреть другие посты и не нашел ничего полезного. Я хочу, чтобы он сохранял каждый раздел команды. Например:
//let's just say command = "debug test"
char part1;
char part2;
split via " "
part1 = "debug"
part2 = "test"
Я пытался использовать sscanf()
, но это просто оборвало бы строку. Например, предположим, что я дал ему строку «тест».
Это выведет:
test -> est -> st //and so on
@EricPostpischil Я попробовал, но это не очень хорошо сработало.
Тогда это ваша проблема, а не этот расплывчатый вопрос. Просмотрите раздел функций поиска стандарта C (C 2018 7.24.5). strtok
, strcspn
и strchr
можно использовать для анализа строки на части. Изучите их характеристики (или найдите информацию о них в учебнике, учебнике или учебнике) и напишите код, используя один из них. Затем, если у вас возникнут проблемы, задайте конкретный вопрос с минимально воспроизводимым примером.
char part1;
хочет быть (по крайней мере) char *part1;
Обучение зависит только от вас.
Вот минимальное решение с использованием sscanf()
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PART_LEN 5
#define str(s) str2(s)
#define str2(s) #s
int main() {
char command[] = "debug test";
char part1[PART_LEN+1] = "";
char part2[PART_LEN+1] = "";
int r = sscanf(command, "%" str(PART_LEN) "s%" str(PART_LEN) "s", part1, part2);
if (r != 2) {
// handle partial input
}
printf("part=%s part2=%s\n", part1, part2);
}
Ключевое понимание:
char []
соответствующего размера, в которых sscanf()
могут храниться копии строк.scanf()
-семейства функций.r != 2
). В этом случае я инициализировал две части пустой строкой.и вот аналогичное решение с strtok()
:
#include <stdio.h>
#include <string.h>
#define DELIM " "
int main() {
char command[] = "debug test";
char *part1 = strtok(command, DELIM);
char *part2 = strtok(NULL, DELIM);
printf("part=%s part2=%s\n", part1 ? part1 : "", part2 ? part2 : "");
}
Ключевое понимание:
command
должна иметь тип char []
, а не char *
, поскольку strtok()
изменяет строку.strtok()
в качестве первого аргумента ожидается строка, а при последующих вызовах — NULL.part1
и/или part2
может иметь значение NULL, в этом случае токены не найдены.Третий вариант — реализовать функцию split()
для возврата массива найденных строк. См. Разделение строки с разделителями в C
В вашем названии упоминается
strtok
. Это полезно для этого. Почему вы его не используете?