Как разбить или токенизировать массив строк с помощью пробела "", чтобы найти второе слово в каждой строке - PullRequest
0 голосов
/ 25 января 2019

У меня есть массив, который содержит кучу строк. Я хочу найти второе слово в каждой из строк, содержащихся в этом массиве, чтобы я мог отсортировать предложения в алфавитном порядке по второму слову в предложении. Я попытался использовать strtok, но он не работает для токенизации массива строк. Разделитель - это просто пространство между каждым словом. Я должен сделать это в C.

1 Ответ

0 голосов
/ 25 января 2019

Сортировка в C обычно выполняется с использованием qsort.Интерфейс является общим, только функция сравнения является специфической для требований сортировки.

Если предположить, что элементы массива являются C-строками, тогда функция сравнения в этом случае может выглядеть следующим образом:

#include <string.h>

int cmp(const void * pv1, const void * pv2)
{
  const char * const * pp1 = pv1;
  const char * const * pp2 = pv2;

  const char * p1 = *pp1 ?*pp1 :""; /* Let's do it the ORxCLx way and tolerate NULLs, by treating them as empty-string. */
  const char * p2 = *pp2 ?*pp2 :""; /* Same. */

  /* Try to get space between 1st and 2nd word: */
  const char * pb1 = strchr(p1, ' ');
  const char * pb2 = strchr(p2, ' ');

  /* In case there was no 1st space
     make begin point to right after the 1st word's end: */
  pb1 = pb1 ?pb1+1 :p1 + strlen(p1);
  pb2 = pb2 ?pb2+1 :p2 + strlen(p2);

  /* Try to get space between 2nd and 3rd word: */
  const char * pe1 = strchr(pb1, ' ');
  const char * pe2 = strchr(pb2, ' ');

  /* In case there was no 2nd space
     make end point right after the 2nd's word's end: */
  pe1 = pe1 ?pe1 :pb1 + strlen(pb1);
  pe2 = pe2 ?pe2 :pb2 + strlen(pb2);

  /* Calculate 2nd word's length: */
  size_t s1 = (size_t)(pe1 - pb1);
  size_t s2 = (size_t)(pe2 - pb2);

  return strncmp(pb1, pb2, s1 > s2 ?s2 :s1);
} 

Используйте это так:

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *, const void *);

int main(void)
{
  const char * as[] = {
    "e 5 y",
    "b 2",
    "c 3 z",
    "d 4 x",
    "c 3 ",
    "a 1",
    "c 3"
  };

  qsort(as, sizeof as / sizeof *as, sizeof *as, cmp);

  for (size_t i = 0; i < sizeof as / sizeof *as; ++i)
  {
    printf("'%s'\n", as[i]);
  }
}

и получите:

'a 1'
'b 2'
'c 3 z'
'c 3'
'c 3 '
'd 4 x'
'e 5 y'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...