Сортировка строк в c с использованием массива указателей

Я пытаюсь сделать мой лабораторный лист, связанный со строкой, массивом и указателем. Проблема заключается в том, чтобы "отсортировать 5 строковых слов, хранящихся в массиве указателей".

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

как если бы я ввел строки, такие как ноутбук и комп, то вывод будет комптоп и ноутбук

Основной код:

main()
{
char *str[10], *t;
int i,j;

for(i=0;i<5;i++)
{
    scanf("%s",&str[i]);
}

for(i=0; i<5; i++)
{
    for(j=i+1; j<5; j++)
    {
        if (strcmp(&str[j-1], &str[j]) > 0)
        {
            t=str[j];
            str[j]=str[j-1];
            str[j-1]=t;
        }
    }
}
printf("\n");

for(i=0;i<5;i++)

{
    printf("%s\n",&str[i]);
}
}

1 ответ

Следующая строка является причиной для неопределенной ошибки.

scanf("%s", &str[i]);

Проблемы:

  1. Тип str[i] является char*, Тип &str[i] является char**, Компилятор должен предупредить вас, что это неправильный тип для использования с данным форматом, %s,

  2. Чтение строки по этому адресу повредит ваш стек и приведет к неопределенному поведению.

Синтаксически говоря, вы можете использовать

scanf("%s", str[i]);

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

Вы можете выделить память для строки в куче или стеке. В настоящее время давайте предположим, что вы не намерены хранить более 99 символов в вашей строке.

Чтобы использовать память из стека:

char str[10][100], *t;
int i,j;

for(i=0;i<5;i++)
{
    scanf("%99s", str[i]);
}

Чтобы использовать память из кучи:

char* str[10], *t;
int i,j;

for(i=0;i<5;i++)
{
    str[i] = malloc(100);
    if ( str[i] != NULL )
    {
       scanf("%99s", str[i]);
    }
}

Обязательно позвони free() когда вы используете память из кучи.

Линия

    if (strcmp(&str[j-1], &str[j]) > 0)

неверно, потому что тип &str[j-1] а также &str[j] является char**, Еще раз, вы должны были получить предупреждения от компилятора об этом. Эта строка должна быть:

    if (strcmp(str[j-1], str[j]) > 0)

Блок:

    {
        t=str[j];
        str[j]=str[j-1];
        str[j-1]=t;
    }

будет работать только если вы используете память из кучи. Если вы используете память из стека, вам нужно будет использовать strcpy() перемещать данные между элементами str,

Линия

printf("%s\n",&str[i]);

должно быть

printf("%s\n", str[i]);

К этому времени вы должны знать почему.

Другие вопросы по тегам