Никогда не приводите 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. Спасибо @ алк