Как отсортировать каждое слово в предложении по алфавиту? - PullRequest
0 голосов
/ 06 апреля 2019

Мне нужно отсортировать каждое слово в предложении в алфавитном порядке, сохраняя слова отделенными друг от друга.Мне не разрешено использовать функцию strtok ().

Пример ввода: I would really appreciate some help

Пример вывода: I dlouw aellry aaceeipprt emos ehlp

Мне удалось отсортировать всю строкув алфавитном порядке. Что дает мне вывод: Iaaacdeeeeehillllmooppprrstuwy

Я не уверен, стоит ли мне вкладывать мой текущий код в цикл, который будет начинаться каждый раз, когда есть пробел.Или если мне нужно прочитать мою строку в двумерный массив и отсортировать каждое слово отдельно.

Я также не уверен, имеет ли смысл сравнивать значения каждого символа или считать вхождение каждой буквы в строке.У меня есть версия каждого, которая дает мне вывод, показанный выше.

Заранее спасибо.

Сравнение версий символов:

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

int main () {

    char str[100];

    printf("Please type a sentence :\n");
    scanf("%[^\n]s", str);

    printf("\nAlphabetical order:\n:);

    char temp;

    int i, j;
    int n = strlen(str);

    for (i = 0; i < n-1; i++) {
        for (j = i+1; j < n; j++) {
            if (str[i] > str[j]) {
                temp = str[i];
                str[i] = str[j];
                str[j] = temp1;
            }
        }
    }

    printf(str);

    return 0;
}

Подсчет версий каждого символа:

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

int main () {

  char ch, input[100], output[100];
  int no[26] = {0}, n, c, t, x;

  printf("Please type a sentence:\n");
  scanf("%s", input);

  n = strlen(input);

  for (c = 0; c < n; c++)
  {
    ch = input[c] - 'a';
    no[ch]++;
  }

  t = 0;

  for (ch = 'a'; ch <= 'z'; ch++)
  {
    x = ch - 'a';

    for (c = 0; c < no[x]; c++)
    {
      output[t] = ch;
      t++
    }
  }
  output[t]  = '\0';

  printf("%s\n", output);

  return 0;

}

Ответы [ 3 ]

0 голосов
/ 06 апреля 2019

В стандартной библиотеке достаточно средств, чтобы вам не нужно было писать какие-либо собственные циклы.См .:

Как токенизировать строку в C ++?

о работе со словами и

Библиотека стандартных алгоритмов C ++

для сортировки и т. Д. О, вы также можете прочитать об итераторах.

0 голосов
/ 06 апреля 2019

Чтение пользовательского ввода с помощью fgets(). Подтвердите успех, прежде чем пытаться использовать ввод.

char buffer[1024];
if (fgets(buffer, sizeof buffer, stdin)) {
  const char *s = buffer;

Поиск букв. Используйте isalpha().

  while (*s) {
    while (!isalpha((unsigned char)*s) && *s) {
      putchar(*s);
      s++;
    }
    const char *start = s;
    while (isalpha((unsigned char)*s)) {
      s++;
    }

Сортировка с qsort() и печать с точностью. Теперь s не обязательно должен заканчиваться нулевым символом . Избегайте sizeof(type) и используйте sizeof *pointer, так как это проще для правильного кодирования, просмотра и обслуживания.

    int len = s - start;
    qsort(start, len, sizeof *start, fcmp);
    printf("%.*s", len, start);
  }
}

fcmp() просто сравнивает символы. Стандартная библиотека имеет тенденцию обрабатывать значение char как значение после его преобразования в unsigned char.

int fcmp(const void *va, const void *vb) {
  const unsigned char *a = va;
  const unsigned char *b = vb;
  return (*a > *b) - (*a < *b);
}

Код мог бы использовать return a - b;. Вышеуказанное более идиоматично и никогда не включает переполнение int (в отличие от тех редких машин с CHAR_MAX > INT_MAX).

0 голосов
/ 06 апреля 2019

std :: sort отсортирует любую последовательность, которую вы ей дадите.Например,

std::sort(str.begin(),str.begin()+5);
std::sort(str.begin()+6,str.end());
std::cout<<str;

Должен выдать Hello dlorw.Вы можете установить собственный оператор сравнения, если хотите по-разному воспринимать заглавную букву.

Теперь вам нужно только перебирать слова.Пожалуйста, не смешивайте в случайном порядке C ++ и C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...