Выбрать буквы в строке и отсортировать - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Может кто помочь? И задачка то вроде простая, и в гугле материала навалом, но сделать из этого профит не могу. С клавиатуры вводится строка. Выберете из нее все буквы от J (j) до S (s) (строчные преобразуйте в прописные) и отсортируйте их в алфавитном порядке. Допустимые символы - прописные и строчные латинские буквы.

Пример: Исходная строка: SHiFOVkaOtSHPIonA Результат: KNOOOPRSS

Решение задачи: «Выбрать буквы в строке и отсортировать»

textual
Листинг программы
#include <stdlib.h>     // qsort, toupper
#include <string.h>     // strlen
#include <stdbool.h>    // true
#include <stdio.h>      // puts, fflush, fgets
 
#define BUF_SIZE 80
 
int tovalid(int c)
{
    c = toupper(c);
    if( c < 'J' || c > 'S' ) {
        c = 0;
    }
    return c;
}
 
void filter(char* dst, char* src)
{
    int c;
    while( c = (unsigned char) *src++ ) {
        if( c = tovalid(c) ) {
            *dst++ = c;
        }
    }
    *dst = '\0';
}
 
int charcmp(const void* a, const void* b)
{
    int code_a = *(unsigned char*)a;
    int code_b = *(unsigned char*)b;
    return code_a - code_b;
}
 
int main(void)
{
    char input[BUF_SIZE];
    char output[BUF_SIZE];
 
    while( true ) {
        puts("Enter string:");
        fflush(stdin);
        fgets(input, sizeof(input), stdin);
        if( input[0] == '\n' ) { break; }
        filter(output, input);
        puts(output);
        qsort(output, strlen(output), sizeof(char), charcmp);
        puts(output);
    }
 
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы со строками, массивами, сортировкой и вводом-выводом
  2. Определяем размер буфера в 80 символов
  3. Создаём функцию tovalid(), которая принимает символ и возвращает его в верхнем регистре, если он находится в допустимом диапазоне ('A'..'S')
  4. Создаём функцию filter(), которая принимает два указателя на строки (исходную и целевую), и перебирает символы исходной строки. Если символ проходит проверку в функции tovalid(), то он добавляется в целевую строку
  5. Создаём функцию charcmp(), которая принимает два указателя на символы и возвращает их разность. Эта функция будет использоваться при сортировке
  6. В функции main() создаём две строки (входную и выходную), затем в цикле запрашиваем у пользователя ввод строки, фильтруем её и сортируем с помощью функции qsort(). Выводим отсортированную строку на экран
  7. Код не содержит ошибок, но он не полностью функционален, так как не обрабатывает ситуацию, когда ввод строки пуст.

Оцени полезность:

13   голосов , оценка 4.385 из 5
Похожие ответы