Независимо от того, как вы приближаетесь к этому, вы просто должны принять его шаг за шагом последовательно, и проверять каждую часть необходимого init DIRECTION X Y
ввода вы получите от пользователя. Не имея возможности использовать семейство scanf
, это не проблема, вам просто нужно будет полагаться на указатели и арифметику индекса.
Один из подходов в этом отношении - Пройдите указатель вниз по вашей строке ввода, сравнивая значения по мере продвижения. Есть много способов сделать это, но один подход заключается в следующем:
#include <stdio.h>
#include <string.h>
#define MAXC 256
void help() { printf (" format 'init DIRECTION X Y'\n"); }
int main (void) {
enum { EAST, NORTH, WEST, SOUTH } dir;
char *names[] = { "EAST", "NORTH", "WEST", "SOUTH" };
char input[MAXC] = "";
char *init = "init";
int x, y;
for (;;) {
char *p, *ep = NULL;
printf ("Enter the commmand: ");
fgets (input, MAXC, stdin);
if (strncmp (input, init, strlen (init))) { /* compare 'init' 1st */
help(); continue;
}
if (!(p = strchr (input, ' ') + 1)) { /* find 1st space */
help(); continue;
} /* locate 'N', 'S', 'E', 'W' */
while (*p && *p != 'E' && *p != 'N' && *p != 'W' && *p != 'S') p++;
if (!*p || !(ep = strchr (p, ' '))) { /* find following space */
help(); continue;
}
*ep = 0; /* nul-terminate */
switch (*p) { /* test cardinal names */
case 'E' : if (strcmp (p, "EAST")) { help(); continue; }
else dir = EAST;
break;
case 'N' : if (strcmp (p, "NORTH")) { help(); continue; }
else dir = NORTH;
break;
case 'W' : if (strcmp (p, "WEST")) { help(); continue; }
else dir = WEST;
break;
case 'S' : if (strcmp (p, "SOUTH")) { help(); continue; }
else dir = SOUTH;
break;
default : help(); continue;
}
*ep = ' '; /* restore space */
p = ep + 1; /* advance to next char */
while (*p && (*p < '0' || '9' < *p)) p++; /* find digit */
if (!*p) {
help(); continue;
}
x = *p++ - '0'; /* set x value -- single digit conversion */
while (*p && (*p < '0' || '9' < *p)) p++; /* find digit */
if (!*p) {
help(); continue;
}
y = *p - '0'; /* set y value -- single digit conversion */
break; /* made it! break out of loop */
}
printf ("\n direction '%s', x '%d', y '%d'\n\n", names[dir], x, y);
return 0;
}
Когда вход не удовлетворяет ваши требования, это полезно, чтобы дать пользователю немного help()
напоминать им о правильном формате, они не бесконечно смотрят на мигающий курсор, задаваясь вопросом, как в решающей части решить головоломку.
Пример использование/вывод
$ ./bin/direction
Enter the commmand: dog food
format 'init DIRECTION X Y'
Enter the commmand: inid NORTH 3 6
format 'init DIRECTION X Y'
Enter the commmand: init EASY 4 5
format 'init DIRECTION X Y'
Enter the commmand: init EAST a 6
format 'init DIRECTION X Y'
Enter the commmand: init WEST 6 b
format 'init DIRECTION X Y'
Enter the commmand: init SOUTH 4 8
direction 'SOUTH', x '4', y '8'
Есть дополнительная валидация можно добавить, но это начало, чтобы ты.
Во-первых, 'strncmp' http://man7.org/linux/man-pages/man3/strcmp.3.html поможет вам ... – Boiethios
' sscanf' также поможет вам. –
Вы не хотите использовать 'scanf', как насчет' sscanf'? – purplepsycho