Как расположить по алфавиту строку и вернуть указатель на отсортированный массив символов? - PullRequest
0 голосов
/ 30 октября 2019

Проблема, над которой я работаю, заключается в следующем: «Определите функцию sortString, которая ожидает массив символов и возвращает указатель на массив символов. Функция сортирует символы в строке в алфавитном порядке, сохраняетих в этом порядке, и возвращает указатель на этот отсортированный массив символов. Массив символов может содержать пробелы и знаки пунктуации. При сортировке пробелы и знаки пунктуации следует игнорировать, а все алфавитные символы следует изменить на строчные для сортировки и вывода. "

Я нахожусь в CLion и пробовал код, но когда я запускаю его, единственное, что он печатает, это ввод строки, которую вы хотите алфавитировать. В чем может быть проблема? Мой код скопирован ниже.

char sortString(char *characters) {
    int i = 0;
    int j = 0;
    int lengthofstring;
    char *throwaway;
    char *newabcorder;
    char anotherthrowaway;

    lengthofstring = strlen(characters);

    newabcorder = (char*)malloc(lengthofstring+1);

    printf("Enter a string you want alphabetized: \n");

    throwaway = characters;

    for ( anotherthrowaway = 'a' ; anotherthrowaway <= 'z' ; anotherthrowaway++ ) {
        for ( i = 0 ; i < lengthofstring ; i++ ) {
            if ( *throwaway == anotherthrowaway ) {
                *(newabcorder+j) = *throwaway;
                j++;
            }
            throwaway++;
        }
        throwaway = characters;
    }
    *(newabcorder+j) = '\0';

    strcpy(characters, newabcorder);
    free(newabcorder);
    return *newabcorder;
}

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Во-первых, вы написали, что функция должна возвращать значение указателя, но ваш тип возвращаемого значения - просто char, измените его на char * sortString .

Во-вторых, вы освобождаете память перед возвратом. это означает, что вы ничего не возвращаете, удалите эту строку. вам нужно объявить переменную-указатель в главном функционале, который получает abcorder от sortString, и эту переменную вы должны освободить в конце программы.

В-третьих, вам нужно вернуть адрес указателя, а непеременная указателя, измените ее с * newabcorder на return newabcorder .

Фиксированная функция:

char* sortString(char *characters) {
int i = 0;
int j = 0;
int lengthofstring;
char *throwaway;
char *newabcorder;
char anotherthrowaway;

lengthofstring = strlen(characters);

newabcorder = (char*)malloc(lengthofstring + 1);

printf("Enter a string you want alphabetized: \n");

throwaway = characters;

for (anotherthrowaway = 'a'; anotherthrowaway <= 'z'; anotherthrowaway++) {
    for (i = 0; i < lengthofstring; i++) {
        if (*throwaway == anotherthrowaway) {
            *(newabcorder + j) = *throwaway;
            j++;
        }
        throwaway++;
    }
    throwaway = characters;
}
*(newabcorder + j) = '\0';

strcpy(characters, newabcorder);
return newabcorder;
}

и основная функция:

int main() {
char str[50], *ptr;
fgets(str, 49, stdin);
ptr = sortString(str);
printf("%s \n", ptr);
free(ptr);
}
0 голосов
/ 30 октября 2019

есть несколько проблем в вашем коде:

  • throwaway = символы не копируют вашу строку, со знаком равенства это тот же указатель (оба одинаковы впамяти вашего компьютера, поэтому вы не можете просто отредактировать один из них) для копирования указателей на символы вы должны использовать strcpy (dest, src)
  • , вы возвращаете символ, и ваш текст говорит, что вы хотите вернуть строку(char *)
  • Я не знаю, что вы хотите распечатать, но поскольку у вас есть только одна строка с функцией печати, это должно быть ясно ..
  • Не освобождайтеуказатель, если вы хотите вернуть его, но освободите все остальные

Поскольку вы должны узнать кое-что, я написал основу из вашей, на которой вы можете построить. Возможно, это не самый элегантный способ, но я уверен, что для вас это лучший способ найти свои ошибки.

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

Кроме того, вам все равно придется выполнить сортировку по пунктуации и пробелам.

Вот основа:

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

char *sortString(char *characters)
{
    int i = 0;
    int j = 0;
    char anotherthrowaway;

    int lengthofstring = strlen(characters);

    char * newabcorder = (char *)malloc(lengthofstring + 1);
    memset(newabcorder, '\0', lengthofstring+1);

    char * throwaway = (char *)malloc(lengthofstring + 1);

    strcpy(throwaway, characters);

    for (anotherthrowaway = 'a'; anotherthrowaway <= 'z'; anotherthrowaway++)
    {
        for (i = 0; i < lengthofstring; i++)
        {
            if (*(throwaway+i) == anotherthrowaway)
            {
                *(newabcorder + j) = anotherthrowaway;
                j++;
            }
        }
    }
    free(throwaway);
    return newabcorder;
}

int main(){
    printf("%s\n", sortString("bcdajktzy"));
    return 0;
}
...