Как установить несколько строк в соответствии с запросом пользователя? А потом отсортировать их и положить в массив строк? - PullRequest
0 голосов
/ 20 апреля 2020

Я получил следующий вопрос: Напишите программу, которая получает количество друзей пользователя от пользователя. Как только номер получен, программа запишет имена участников. Сохраните имена в массиве (это будет строковый массив, то есть массив char **), чтобы каждая ячейка в массиве указывала на начало строки. Затем сортируйте массив в алфавитном порядке (используя функцию strcmp и меняйте местами указатели) и печатайте имена членов по порядку.

Пока это то, что я сделал, и я не понимаю, почему он не работает :

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

int main()
{
    int choice = 0;

    int i = 0;

printf("Enter number of friends: ");
scanf_s("%d", &choice);

char* friends = (char*)malloc(choice * 50 * sizeof(char));


for (i = 0; i < choice; i++)
{
    printf("Enter name of friend %d: ", (i + 1));
    scanf_s("%s", &friends[i]);
}

getchar();
return 0;
}

Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 20 апреля 2020

Никогда не приводите mallo c, как вы делали в своем коде.

char* friends = (char*)malloc(choice * 50 * sizeof(char));

Если вы объявили friends в качестве указателя, как указано выше, friends[i] - это только символ i_th в строке friends (например, с friends = "abcd", friends[0] = 'a', friends[1] = 'b' и т. Д.).

Если вы хотите сохранить все имена, вы должны использовать 2D-массив, двойной указатель или массив указателей:

char friends[choice][50]; // (1)

ИЛИ

char * friends[choice];  // (2)

ИЛИ

char ** friends;  // (3)

Для решения (2) необходимо выделить для каждого указателя в массиве friends (не забудьте освободить указатель на конец программы):

for(int i = 0; i < choice; i++) {
   friends[i] = malloc(sizeof(char) * 50);
   if (!friends[i])
     // handle the error of malloc function
     return -1;
}

Затем для функции scanf (вместо scanf можно использовать fgets):

scanf("%49s", friends[i]);

Если вы хотите использовать двойной указатель ( Решение (3)), вы должны выделить для указателя friends затем для каждого указателя friend[i] (не забудьте освободить все указатели в конце программы):

friends = malloc(sizeof(char *)*  choice);
if (!friends)
     // handle the error of malloc function
     return -1;
for(int i = 0; i < choice; i++) {
   friends[i] = malloc(sizeof(char) * 50);
   if (!friends[i])
     // handle the error of malloc function
     return -1;
}

Одно внимание, решения (1) и (2) требуют, чтобы VLA были доступны. Они имеют C с C99 и стали опциональными с C11. Спасибо @ алк

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