Member 13590330 Ответов: 2

Программирование на языке Си: как хранить имена в одномерном массиве ?


Пример сколько имен: 3
1 Имя: Женя
Имя 2: Том
Имя 3: Джон
Эти 3 имени: Джек том Джон.

Что я уже пробовал:

#включить<stdio.h>
#include<string.h>
int i,n;
char s[50],array[50];
главный(){
printf("сколько имен : ");
scanf("%d",&n);
для (i=0;i<n;i++){
printf("Name %d : ",i+1);
получает(ы);

после этого я попытался назначить array[i]=s , но это не сработало
и я попробовал еще много раз, но он продолжал показывать ноль.

Patrice T

Что вы имеете в виду под этим:
-Программирование на языке Си: как хранить имена в одномерном массиве?
Что вы хотите сделать с 3 именами и переменной 1d?
Вы хотите построить большую строку или смоделировать 2d-массив ?

2 Ответов

Рейтинг:
1

OriginalGriff

Проблема в том, что "имена" - это строки: каждое из них представляет собой массив char

char name1[] = "Jack";
printf("%s\n", name1);
char name2[] = "Tom";
printf("%s\n", name2);
Таким образом, вы не можете легко держать их в одномерном массиве, как ваш.
То что вам нужно это одномерный массив данных pointer to char значения, каждое из которых имеет отдельное имя:
char* names[] = {"Jack", "Tom", "John"};
for (int i = 0; i < 3; i++)
   {
    printf("%s\n", names[i]);
   }

Чтобы прочитать их от пользователя, это сложнее: вам нужно использовать malloc чтобы выделить место для данных, которые пользователь собирается вводить перед каждым вызовом scanf, и сохранить возвращаемый им Указатель в вашем names массив.


Рейтинг:
1

Richard MacCutchan

Вы считываете строку в массив s но ты никогда ничего с ним не делаешь. Если вы хотите сохранить имена, то вам нужно скопировать каждое из них в свой собственный массив. самый простой способ сделать это-создать 2-мерный массив, что-то вроде:

char names[4][16]; // 4 arrays each of 16 characters
// in the loop
for (i=0;i<n;i++)
{
    printf("Name %d : ",i+1);
    gets(names[i]);
}

Однако, поскольку вы не знаете, сколько массивов существует в первую очередь, вам нужно будет сделать некоторое динамическое распределение и использовать символьные указатели. Что-то вроде:
char** names; // a pointer to an unknown number of arrays
names = (char**)malloc(n * sizeof(char*)); // allocate the array pointers
// in the loop
for (i=0;i<n;i++)
{
    printf("Name %d : ",i+1);
    names[i] = (char*)malloc(16); // allocate an array for the next name
    gets(names[i]);
}