Почему я получаю ошибку сегментации для следующего кода? - PullRequest
2 голосов
/ 14 июня 2019

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int x,i,j,length;
    printf("Enter the number of names you want to sort.\n");
    scanf("%d",&x);
    char *names[x],*p,name[50],*t;
    printf("Enter the names:\n");
    for(i=0;i<x;i++)
    {
        scanf(" %[^\n]",name);
        length = strlen(name);
        p = (char *)malloc(length+1);
        strcpy(p,name);
        names[i] = p;
    }
    printf("Entered names are:\n\n");
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    printf("\n\nThe sorted names are:\n");
    for(i=0;i<x-1;i++)
    {

        for(j=i+1;j<x;j++)
        {
            if(strcmp(names[i],names[j])>0)
            {
                strcpy(t,names[i]);
                strcpy(names[i],names[j]);
                strcpy(names[j],t);
            }
        }    
    }
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    return 0;
}

1 Ответ

6 голосов
/ 14 июня 2019

Вы не выделили t, поэтому strcpy(t,names[i]) перестанет работать.

Вы также можете использовать strdup() 1 для дублирования ваших строк (вместо malloc() и strcpy()).

И, так как ваш массив состоит из char* элементов, вы можете просто поменять их местами напрямую:

t=names[i];
names[i]=names[j];
names[j]=t;

Что касается вашего вопроса об указателях, вы можете рассматривать указатели как uint32_t: это «просто» значения, которые вы можете назначить, как обычные целые числа. Это просто их значение, которое интерпретируется как адрес, а не случайное целое число (т.е. его значение имеет особое значение для компьютера, поскольку оно тесно связано с памятью).

1 : Как отмечает @WhozCraig, strdup() является , а не частью стандартной библиотеки, поэтому вам потребуется #include соответствующих заголовков для вашей платформы (это хотя и широко распространен и вряд ли является проблемой).

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