Строки и функции работы с ними (задание)
Необходимо ввести строку произвольной размерности, содержащую английские слова, разделённые любым количеством пробелов между собой. Выполнить сортировку слов по алфавиту и вывести готовый вариант на экран (с использованием прототипов своих функций и их реализацией). Я написал идею своего кода, но она нерабочая - программа обрывается на цикле с strcmp:
if (strcmp(*(s+i), *(s+j)) < 0)
Мой код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
char* vvod_str(int* len)
{
*len = 0;
int cap = 1;
char* s = (char*)malloc(sizeof(char));
char c = getchar();
while (c != '\n') {
s[(*len)++] = c;
if (*len >= cap) {
cap *= 2;
s = (char*)realloc(s, cap * sizeof(char));
}
c = getchar();
}
s[*len] = '\0';
return s;
}
void sort_words(char** s, int n)
{
char* x;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (strcmp(*(s+i), *(s+j)) < 0)
{
x = *(s+j);
*(s + j) = *(s + i);
*(s + i) = x;
}
}
}
}
int main()
{
int n;
printf("Enter string: ");
char* s = vvod_str(&n);
sort_words(&s, n);
printf("Sort string: ");
puts(s);
free(s);
return 0;
}
Ответы (1 шт):
я может что-то путаю, но я вижу
- ввод строки посимвольно
- попытку отсортировать массив строк
а вот разбитие введенной строки на массив слов я не вижу
в итоге у вас происходит следующее:
- когда вводится строка вы определяете ее длину (кол-во символов) -
len - строка у вас одна, но
n- кол-во слов у вас указано отlen- кол-во символов - и когда выполняется
вот этот код:
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (strcmp(*(s+i), *(s+j)) < 0)
вы сравниваете не строки, вы интерпретируете char* (строку) как char** (массив строк) и пытаетесь сравнивать несколько строк
n > 1 (длина начальной строки), то происходит вход в двойной цикл и
из строки вы получаете по 4 байта строки которые интерпретируете как указатели!!!
в итоге на выходе левые указатели на левые данные, сравнение которых приводит к ошибке