В некотором контексте моя игра запускается в терминале и похожа на игру типа командной строки. На данный момент для обработки команд используется 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. Это полезно для этого. Почему вы его не используете?