Сортировка строк в 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]);
Проблемы:
Тип
str[i]
являетсяchar*
, Тип&str[i]
являетсяchar**
, Компилятор должен предупредить вас, что это неправильный тип для использования с данным форматом,%s
,Чтение строки по этому адресу повредит ваш стек и приведет к неопределенному поведению.
Синтаксически говоря, вы можете использовать
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]);
К этому времени вы должны знать почему.