Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2014, 18:58   #1
AdelinaMango
Пользователь
 
Регистрация: 26.03.2014
Сообщений: 13
По умолчанию как ввести массив строк, число которых заранее не известно?

как ввести массив строк, число которых заранее не известно? можно код на языке си пожалуйста
AdelinaMango вне форума Ответить с цитированием
Старый 15.04.2014, 19:12   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Выделить память для N записей через malloc. Если введут больше - выделить 2N записей через realloc. И так до победы.
Son Of Pain вне форума Ответить с цитированием
Старый 15.04.2014, 19:30   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Я бы использовал контейнеры. (см. std::list std::vector std::array и т.п.)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.04.2014 в 19:33.
ROD вне форума Ответить с цитированием
Старый 15.04.2014, 19:55   #4
AdelinaMango
Пользователь
 
Регистрация: 26.03.2014
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Выделить память для N записей через malloc. Если введут больше - выделить 2N записей через realloc. И так до победы.
можно попросить у вас код?
AdelinaMango вне форума Ответить с цитированием
Старый 15.04.2014, 20:22   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
можно попросить у вас код?
Код:
int N=0; //длинна выделенного куска
int n=0; //длинна задействованного куска
char * buffer=0;

N=256;//why not?
buffer = (char*) malloc (N);
if (buffer==NULL) exit (1);//и такое бывает


//...

if(n>=N)
{
N*=2;
buffer = (char*) realloc (buffer, N);
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.04.2014, 20:41   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Я бы использовал контейнеры. (см. std::list std::vector std::array и т.п.)
Просят ведь
Цитата:
код на языке си
, контейнеры не проходят ценз )
Son Of Pain вне форума Ответить с цитированием
Старый 17.04.2014, 10:15   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Про "си" не увидел да, действительно не проходят. Тогда только malloc и realloc
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 17.04.2014, 12:03   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ROD
Цитата:
число которых заранее не известно
Цитата:
Я бы использовал контейнеры. (см. std::list std::vector std::array и т.п.)
Цитата:
std::array
orly?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 17.04.2014, 16:49   #9
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Вообще, интересный вопрос... Если каждый раз выделять новую память под новую часть строк, их же может раскидать по оперативке. Может, как-то через структуру, типа:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STRING_SIZE 256
typedef struct
{
        char Str[MAX_STRING_SIZE];
        int id;
} StrArr;
struct list
{
char Str[MAX_STRING_SIZE];
struct list *next;
}*head,*current,*tail;
int main(int argc, char *argv[])
{
int n=1,i;
char st[MAX_STRING_SIZE];
StrArr *Arr;
printf("Input strings:\n");


gets(st);


if((head=(struct list *)malloc(sizeof(*head)))==NULL)
{
                 printf("Memory error\n");
                 return -1;
}
strcpy(&(*head->Str),st);
tail=current=head;
while (1)
{
      gets(st);
      if (strlen(st)==1 && st[0]=='%') break;
      if((current->next=(struct list *)malloc(sizeof(*head)))==NULL)
      {
                 printf("Memory error\n");
                 return -1;
      }
      current=current->next;
      strcpy(&(*current->Str),st);
      ++n;
}
tail=current;

current=head;
if ((Arr=(StrArr *)malloc(n*sizeof(StrArr)))==NULL)
{
                 printf("Memory error\n");
                 return -1;
}

for (i=0;i<n;i++) 
{
    strcpy(Arr[i].Str,&(*current->Str)); 
    Arr[i].id=i; 
    current=current->next;
}

current=head;
for (i=0;i<n;i++) 
{
    head=current->next;
    free(current); 
    current=head;
}

printf("Input was:\n");
for (i=0;i<n;i++) 
       printf("%d %s\n",Arr[i].id,Arr[i].Str);
free(Arr);

system("PAUSE");	
return 0;
}
То есть, можно поиметь массив структур Arr где все строки будут в порядке ввода, да ещё и с idшниками в качестве бонуса. Ну и для окончания ввода теперь надо просто написать '%'. То есть, если ввести "%blabla" - ввод не закончится.
Вот так вот (с) А. Невский

Последний раз редактировалось NomenEstOmen; 18.04.2014 в 11:59. Причина: Добавил проверки, убрал лишнее, убрал тупейшую ошибку очистки памяти.
NomenEstOmen вне форума Ответить с цитированием
Старый 18.04.2014, 23:27   #10
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

Очень бы, кстати, хотелось узнать мнение продвинутых товарищей по поводу моего рацпредложения. Ибо с Си познакомился не так давно. Сейчас вот набираюсь опыта...
NomenEstOmen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести число N. Вывести N строк с номером строки, двоеточием и набором чисел от 1 до N+1-k (где k-номер строки) ( в С ) Eduard12345 Помощь студентам 1 11.10.2013 07:25
заранее не известно количество аргументов SAMOUCHKA Общие вопросы C/C++ 7 18.05.2013 23:35
Найти сумму элементов матрицы и подсчитать число ее строк, в пределах каждой из которых элементы упорядочены по возрастанию:Ai1<Ai Renc Visual C++ 0 12.04.2013 13:59
Дан массив размерности, определить номера строк элементы которых образуют последовательность С++ Lera Помощь студентам 2 18.12.2009 17:17
Ввести натуральное число N . Вывести треугольник, содержащий N строк вида Arei15 Помощь студентам 2 31.10.2009 23:41