Как мне отделить строки от неопределенного ввода пользователя в C? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь принять ввод от пользователя для программы, и ввод имеет следующие условия:

пользователь введет строку - либо "foo", либо "bar", но строки могут иметьстолько пробелов до или после.

, после чего пользователь введет другую строку (может быть что угодно) - например, "Jacob McQueen" или "Случайная строка с 4 словами"

Поэтому, если пользователь вводит - ______foo___Jacob McQueen

('_' означает символ пробела)

Мне нужно отделить строки "foo" и "Jacob McQueen".

Как я должен сделать это в C?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вы можете использовать scanf для выполнения тяжелых работ. «% S» будет читать первый токен (foo / bar), а «% [^ \ n]» будет читать все остальное, вплоть до новой строки, в word2. Длина может быть произвольной.

   char word1[10], word2[100] ;
   if ( scanf("%9s %99[^\n]", word1, word2) == 2 ) {
      // Do something with word1, word2
   } ;

Если вам нужна неограниченная длина, попробуйте использовать модификатор длины 'm' для неправильных строк

0 голосов
/ 06 ноября 2019
int extract(const char s, char **key_ptr, char **rest_ptr) {
   *key_ptr  = NULL;
   *rest_ptr = NULL;

   const char *start_key;
   const char *end_key;
   const char *start_rest;

   // Skip leading spaces.
   while (*s == ' ')
      ++s;

   // Incorrect format.
   if (!*s)
      goto ERROR;

   start_key = s;

   // Find end of word.
   while (*s && *s != ' ')
      ++s;

   // Incorrect format.
   if (!*s)
      goto ERROR;

   end_key = s;

   // Skip spaces.
   while (*s == ' ')
      ++s;

   /* Uncomment if you want to disallow zero-length "rest".
   ** // Incorrect format.
   ** if (!*s)
   **    goto ERROR;
   */

   start_rest = s;

   const size_t len_key = end_key-start_key;
   *key_ptr = malloc(len_key+1);
   if (*key_ptr == NULL)
      goto ERROR;

   memcpy(*key_ptr, start_key, len_key);
   (*key_ptr)[len_key] = 0;

   *rest_ptr = strdup(start_rest);
   if (*rest_ptr == NULL)
      goto ERROR;

   return 1;

ERROR:
   free(*key_ptr);  *key_ptr  = NULL;
   free(*rest_ptr); *rest_ptr = NULL;
   return 0;
}

Использование:

char *key;
char *rest;
if (extract(s, &key, &rest)) {
   printf("Found [%s] [%s]\n", key, rest);
   free(key);
   free(rest);
} else {
   printf("No match.\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...