Задать вопрос
@senqqqq

Как сделать одномерный массив в си?

Например на вход идет строка
1 2 3 4 5 6 7
хочу чтобы эта строка превратилась в массив с целочисленным типом данных
пробовал таким способом:
while (scanf("%d ", &n) == 1){
list[size++] = n;
}
однако при вводе оно просит ввести еще один символ, что неудобно
  • Вопрос задан
  • 243 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@res2001
Developer, ex-admin
Если количество цифр фиксировано, то просто перечислите в формате scanf сразу их все.
Если количество цифр может меняться, то ...
Вводить как строку и потом парсить ее с помощью strtol, кода будет, конечно, больше, чем сейчас.
Строку вводить в какой-то достаточно большой буфер длинной в 1 или 4 кб.
При превышении буфера можно выдавать ошибку.
Или ввод оформить в цикл, на случай, если буфер заполнится, а Enter пользователь еще не нажал. Выход из цикла по нахождению символа '/n' в буфере. В таком случае буфер можно делать меньше. Но тут возникает дополнительная проблема с неоконченным вводом, т.е. пользователь вводит число 123456 и допустим 123 прилетело в конец прошлого буфера, а 456 в начало следующего. Это надо будет решать в коде.

Есть проблема с фиксированным размером массива.
Если нужен произвольный размер входных данных, то можно, предварительно выделять массив какого-нибудь начального размера, если в ходе парсинга размер массива превысится, то сделать realloc увеличив размер массива в 2 раза. Ну и надо отдельно хранить количество реально заполненных элементов массива.
А вообще, массив может оказаться не нужен, если взглянуть на задачу целиком.
Ответ написан
includedlibrary
@includedlibrary
Либо заранее просить пользователя ввести размер и использовать for:
int size;
scanf("%d", &size);
int *list = malloc(sizeof(int) * size);
for(int i = 0; i < size; i++)
    scanf("%d", &list[i]);


Либо как сделали вы.

Такой код, кстати, list[size++] = n; в какой-то момент приведёт к segfaul, потому что list, очевидно, фиксированного размера, а работа предполагается с массивом переменной длины. Почитайте про malloc/realloc
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Пересчитать пробелы в строке
Взять памяти на тип int на единицу больше чем насчитал пробелов (можно на два, для страховки)
Двигаясь по строке, последовательно заменять пробел на '\0' и через atoi() например переводить элемент строки в элемент массива.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы