Как сделать так чтобы массив считал/менял при нажатие буквы? - C (СИ)
Формулировка задачи:
я вроде освоил работу с массивами и применяю ее во всех заданиях какие есть у меня.только мне всегда приходится вводить начальное число массива и только потом действия.а как чтобы не надо было вводить колво элементов в начале?вот к примеру .и дальше там разные действия я применял(сортировал/считал/ариф.прог и т.д)так вот помогите пожалуйста как заменить колво элементов в к примеру любой буквой или enter?
#include <stdio.h>
int main(void)
{int mass[256],i,n;
printf("N=");scanf("%d",&n);
for (i=0;i<n;i++){
printf("x[%d]=",i);
scanf("%d",&mass[i]);}
for (i=0;i<n;i++){
printf("%d\t",mass[i]);}
}Решение задачи: «Как сделать так чтобы массив считал/менял при нажатие буквы?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
size_t size = 0; // текущий размер
size_t space = 1; // сколько всего доступно места
int* arr = malloc(size*sizeof(int));
int ch;
while((ch=getchar())!='\n') {
if (!isdigit(ch))
continue;
ungetc(ch, stdin); // если число, возвращаем символ в поток
scanf("%d", &ch);
if (space == size) {
space *= 2; // что бы часто не делать realloc
arr = realloc(arr, space*sizeof(int));
}
arr[size++] = ch;
}
for(size_t i = 0; i < size; i++)
printf("%d ", arr[i]);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Подключаются необходимые библиотеки
- Инициализируются две переменные: size (текущий размер массива) и space (общее количество доступного места). Обе переменные инициализируются нулями.
- Выделяется память под массив. Для этого используется функция malloc, которой передается размер в байтах (так как scanf записывает в массив указателей, а не в массив int). Размер в байтах равен произведению size на sizeof(int).
- В цикле while считывается ввод пользователя. Если считанный символ не является числом (проверка isdigit), то цикл продолжает считывать следующий символ. Если считанное число, то оно считывается в переменную ch, а затем возвращается в поток ввода с помощью функции ungetc. Это нужно для корректного считывания последующего ввода.
- Если размер массива (size) равен общему количеству доступного места (space), то размер double-удваивается, чтобы выделить больше места под массив. Затем с помощью функции realloc изменяется размер массива.
- Считанное число записывается в массив. Переменная size увеличивается на единицу.
- После окончания цикла while выводится на экран весь массив.
- Программа возвращает 0, что означает успешное выполнение.