Другие языки программирования и технологии
Язык Си|Будет ли ошибкой, если я буду увеличивать размер массива по мере ввода в него?
Можно ли так сделать или это ошибка? То есть заранее не известно сколько символов введут в массив, и по мере ввода увеличивать размер массива? Мне кажется это ошибка
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int* buffer;
size_t size;
size_t count;
} vector;
vector create(size_t size);
void push_back(vector* v, int item);
void increase(vector* v);
void print(vector* v);
void destroy(vector* v);
int main(void) {
vector arr = create(1);
size_t i;
for (i = 0; i < 15; ++i) {
push_back(&arr, i + 1);
print(&arr);
}
destroy(&arr);
getchar();
return 0;
}
vector create(size_t size) {
vector v;
if (0 == size) v.size = 8;
else {
v.buffer = (int*)malloc(size * sizeof(int));
v.size = size;
}
v.count = 0;
return v;
}
void push_back(vector* v, int item) {
if (0 == v->size) (v->count)++;
if (v->size == v->count) increase(v);
(v->buffer)[v->count] = item;
(v->count)++;
}
void increase(vector* v) {
v->size <<= 1;
v->buffer = (int*)realloc(v->buffer, v->size * sizeof(int));
}
void print(vector* v) {
int* next = NULL;
for (next = v->buffer; next != v->buffer + v->count; ++next) printf(" %i", *next);
printf("\n");
}
void destroy(vector* v) {
free(v->buffer);
}
#include <stdlib.h>
typedef struct {
int* buffer;
size_t size;
size_t count;
} vector;
vector create(size_t size);
void push_back(vector* v, int item);
void increase(vector* v);
void print(vector* v);
void destroy(vector* v);
int main(void) {
vector arr = create(1);
size_t i;
for (i = 0; i < 15; ++i) {
push_back(&arr, i + 1);
print(&arr);
}
destroy(&arr);
getchar();
return 0;
}
vector create(size_t size) {
vector v;
if (0 == size) v.size = 8;
else {
v.buffer = (int*)malloc(size * sizeof(int));
v.size = size;
}
v.count = 0;
return v;
}
void push_back(vector* v, int item) {
if (0 == v->size) (v->count)++;
if (v->size == v->count) increase(v);
(v->buffer)[v->count] = item;
(v->count)++;
}
void increase(vector* v) {
v->size <<= 1;
v->buffer = (int*)realloc(v->buffer, v->size * sizeof(int));
}
void print(vector* v) {
int* next = NULL;
for (next = v->buffer; next != v->buffer + v->count; ++next) printf(" %i", *next);
printf("\n");
}
void destroy(vector* v) {
free(v->buffer);
}
Алексей Калугин
Красавец) спасибо!
Почему ошибка? Увеличивайте на здоровье. Только не по одному символу, а сразу раза в два, чтобы слишком часто не делать системные вызовы.
Алексей Калугин
Будет ли это ошибкой?
int mas[1];
int m=0;
while((c=getchar())!=EOF)
{
mas[m]=c;
++m;
}
int mas[1];
int m=0;
while((c=getchar())!=EOF)
{
mas[m]=c;
++m;
}
Если будешь хранить массив в куче - то можешь изменять размер при приближении к границе, вообще реально запилить аналог крестового std::vector :) То есть автоматически будет меняться размер...
Алексей Калугин
Будет ли это ошибкой?
int mas[1];
int m=0;
while((c=getchar())!=EOF)
{
mas[m]=c;
++m;
}
int mas[1];
int m=0;
while((c=getchar())!=EOF)
{
mas[m]=c;
++m;
}
если язык С+ то будет ошибка
Похожие вопросы
- Как определить размер массива в процессе ввода? C++
- Язык си, двухмерный массив и функция.
- Язык Си: В одномерном массиве, состоящем из n вещественных элементов, вычислить: номер максимального по модулю элемента
- Язык СИ. Массивы Ребят, как на Си написать сортировку массива от меньшего к большему?
- Как запретить ввод символов в программе на языке СИ++?
- Помогите.Массивы.Язык Си.
- Поменять местами первый и последний отрицательные элементы массива B (18). (Язык Си) (Язык Си)
- Помогите с массивом и сортировкой методом пузырька в языке Си! Прогу надо сдать в пятницу срочно, не знаю как начать!
- Язык си, не понял несколько моментов по массивам и строкам
- Двумерный массив. Язык Си.