Сортировка строк без учета регистра;верхний регистр первый для одинаковых строк - PullRequest
0 голосов
/ 15 февраля 2019

Я написал такой фрагмент кода:

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

int compare_str(const void* a, const void* b)
{
    char * const * aa=a;
    char * const * bb=b;
    return strcasecmp(*aa, *bb);
}

int sort_alphabetically(char tab[])
{
    if(strlen(tab)<1 || tab[strlen(tab)-1]=='\n')
    {
        return 1;
    }
    for(unsigned int i=0; i<strlen(tab); i++)
    {
        if(tab[i]=='-')
        {
            return 1;
        }
    }
    int spaces_count=0;
    int first=0;
    int ch=0;
    for(unsigned int i=1; i<strlen(tab); i++)
    {
        if(tab[i]!=' ')
            first=1;
        if(tab[0]==' ' && tab[1]==' ')
            ch=1;
        if(tab[i]==' ' && tab[i+1]>=33 && tab[i+1]<=126 && first==1)
            spaces_count++;
    }
    int words_count=spaces_count+1;
    char **words=malloc(words_count * sizeof(char*));
    char *pch;
    int word_idx=0;
    pch=strtok(tab, " ");
    while(pch!=NULL)
    {
        words[word_idx++]=strdup(pch);
        pch=strtok(NULL, " ");
    }
    qsort(words, words_count, sizeof(char*), compare_str);
    for(int i=0; i<words_count; i++)
    {
        for(unsigned int j=0; j<strlen(words[i]); j++)
        {
            if(ch==0)
                *(tab++)=words[i][j];
            else
                if(words[i][j]!=' ')
                {
                    *(tab++)=words[i][j];
                    ch=0;
                }
        }
        if(i!=words_count-1)
            *(tab++)=' ';
        else
            *(tab++)='\0';
        free(words[i]);
    }
    free(words);
    for(unsigned int i=0; i<strlen(tab); i++)
        if(tab[i]==' ' && tab[i+1]==' ')
            tab[i]='\0';
    return 0;
}

int main()
{
    char input[1000];
    printf("Enter text: ");
    if(fgets(input, 1000, stdin))
    {
        if(input[strlen(input)-1]=='\n')
            input[strlen(input)-1]='\0';
        if(sort_alphabetically(input))
        {
            fprintf(stderr, "Incorrect input data");
            return 2;
        }
        else
            printf("%s", input);
    }
    return 0;
}

Он сортирует слова в алфавитном порядке, введенные пользователем.Дело в том, что это делает работу, но я также хотел бы проверить, совпадают ли слова.Если они состоят из слова с первой заглавной буквой, то должны стоять перед словом с первой маленькой буквой.Пример:

Введите текст:

ТЕХНОЛОГИЯ И ОБУЧЕНИЕ НАМ, ЧТОБЫ БЫТЬ ЧЕЛОВЕКОМ ОСНОВНОЕ ОБЕСПЕЧЕНИЕ ЕСТЬ

Выход должен быть:

АГАИНСИМОСТЬ Будь человеком ЕСТЬ ОБУЧЕНИЕ ОБУЧЕНИЮ ТЕХНОЛОГИИ ДЛЯ НАС

Но это:

АГАИНСИМОСТЬ Будь человеком Я ЕСТЬ ОБЕСПЕЧЕНИЕ ОБУЧЕНИЯ ТЕХНОЛОГИИ НАС

Что меняетсяя должен сделать?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Чтобы достичь того, что вы хотите, вы должны немного изменить свою функцию сравнения.Как вы заметили, strcasecmp() сделает порядок двух одинаковых слов неопределенным.Итак, если strcasecmp() считает два слова равными (без учета регистра), вам нужно сравнить их с учетом регистра (с соответствующей функцией, вы догадаетесь, какая;) и вернуть этот результат.В противном случае просто верните результат strcasecmp().

0 голосов
/ 15 февраля 2019

Ваша функция сравнения compare_str - это обертка вокруг strcasecmp(), которая явно и конкретно выполняет сравнение без учета регистра.Если вместо этого вам нужно сравнение с учетом регистра, то замените его на функцию, которая его предоставляет, или напишите замену, или просто добавьте код к compare_str, чтобы более тонко дифференцировать в случаях, когда strcasecmp() возвращает 0, в зависимости от того, что именноВы хотите заказать.

Поскольку характер и детали вопроса заставляют меня подозревать, что это академическое упражнение, я оставляю вам на усмотрение детали.Цель состоит в том, что compare_str() должен возвращать отрицательное число, если первый аргумент должен быть отсортирован перед вторым, положительное число, если второй должен быть отсортирован перед первым, или ноль, если любой порядок приемлем.

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