2016-04-30 5 views
-1

Я пытаюсь создать массив из целых чисел, которые вводит пользователь. Они должны вводиться в одной строке, например. 5 1 2 3 1 6. Количество целых чисел может быть любой суммой.Сохранение целых чисел в виде массива путем считывания размера массива и элементов массива в одной строке

Однако первое число + 1 определяет размер массива. Например. если пользователь сначала вводит номер 5, за ним должны следовать 5 других случайных целых чисел, таким образом делая длину массива 6. Я смущаюсь о том, как это сделать, потому что так много пользовательского ввода. Заранее спасибо!

Вот мой код до сих пор, хотя я не думаю, что это будет большая помощь:

#include <stdio.h> 

int main(void) { 
    int arr_days[13]; 
    int i = 0; 
    printf(" "); 
    while(i < 13) { 
     scanf("%d", &arr_days[i]); 
     i = i + 1; 
    } 
    printf("%d", arr_days[0]); 
    return 0; 
} 
+0

извините, я только что редактировал его –

+0

. Задайте конкретный вопрос. Что вы думаете о коде, в котором вам нужна помощь? Каким образом это не делает то, что вы хотите? – kaylum

+0

Вопрос о том, как я основываю длину массива на первом номере, введенном пользователем? например как сделать массив длиной 6, если пользователь вводит 5 2 5 314 135 123? –

ответ

0

Вы были не слишком далеко, вам просто нужно выделить буфер динамически и читать первый номер отдельно, чтобы вы знали, сколько места и сколько циклов выполнить.

Возможно, вы также захотите проверить, является ли arr_days NULL после malloc для защиты от проблем с «отсутствием памяти».

#include <stdio.h> 

int main(void) { 
    int* arr_days; 
    int i = 0; 
    int n; 
    printf(" "); 
    // get first number to find out how many more to expect 
    scanf("%d", &n); 
    // create memory space to store them 
    arr_days = malloc(n * sizeof(int)); 
    while(i < n) { 
     scanf("%d", &arr_days[i]); 
     i = i + 1; 
    } 
    printf("%d", arr_days[0]); 
    return 0; 
} 

EDIT: Я вижу некоторые комментарии ниже, что есть некоторые путаницы в отношении scanf. Эта команда инициирует запрос ввода, если нет ожидающего ввода, затем он будет обрабатывать любые ожидающие ввода. Поэтому, когда вы вводите кучу чисел в ответ на приглашение ввода scanf (или передаете текстовый файл с этими номерами в программу), каждый вызов scanf («% d», ...) будет извлекать только следующий сингл целое число, оставив остальную часть ввода доступной. Если вы думаете об этом, как строка - это файл, scanf читает из этого файла и оставляет указатель файла в конце бит, который он только что прочитал для следующего вызова, чтобы прочитать следующий бит ... (что и есть то, что произойдет, если вы нажмете текстовый файл!)

+0

хорошо, что имеет смысл, я просто не знаком с функцией malloc раньше, спасибо! –

+0

добро пожаловать! – PeteB

0

Сначала вам нужно будет получить номер, чтобы вы знали, сколько чисел нужно читать и как большой выделять массив.

int num; 
scanf("%d", &num); 

int *arr = malloc(num * sizeof(int)); 

Во-вторых, прочитайте каждое из номеров по одному.

int I; 
for (I = 0; I < num; I++) { 
    scanf("%d", &arr[I]); 
} 

Это показывает, как пример того, как сделать задачу, вам нужно будет позаботиться о регистрации scanf «s результат, чтобы убедиться, вход был успешным, и проверить malloc для выделения тоже.

+0

ОП не упоминал ничего о сортировке ... вы отвечаете на другой вопрос или только в том же классе? :) – PeteB

+0

Good catch @PeteB Я видел «Сортировку» вместо «Хранения», мои глаза падали. ;-) – fluter

+0

Но как это возможно, если все они должны быть введены в одну строку? Как каждый номер может считываться один за другим, если числовое число, указанное вами, находится на той же строке, что и остальные? –

0

Если вы хотите установить размер массива на основе ввода, сначала нужно прочитать вход. Вы хотите, чтобы вводил все числа в строке (включая размер массива), что означает, что числа будут считаны после окончания строки (после нажатия [Enter]). Этот случай невозможно со статическими массивами.

Вы не можете прочитать все входы, т. Е. Размер массива & целые числа, которые должны быть помещены в него в той же строке & построить статический массив. Но вы можете построить динамический массив путем реализации динамического массива и ввода всех входных данных в одну строку.

динамический массив является повторно значительная массив или массив список со случайными доступа, переменного размера структуры данных списка, который позволяет элементов, чтобы быть добавлены или удалены.

статический массив требуется размер массива должен быть создан таким образом, что , что память может быть выделена, прежде чем элементы массива могут быть добавлены к нему.

Всего это, как говорится, , если ваш размер массива имеет верхний предел размера (то есть максимальное количество элементов, которые вы приняли бы установлено), то вы можете создать статический массив максимального размера и читать вас входы в нее.

int arr[MAX_ARRAY_SIZE ASSUMED]; 

Это выделяет массив размера MAX_SIZE_ASSUMED, что означает все входы, возможно, хранится в статическом массиве. Но это плохой способ реализовать, поскольку MAX_SIZE_ASSUMED всегда является размером массива, даже если вы можете просто ввести один элемент в массив.

+0

@RRrMmm просто форму поиска динамической реализации массивов в C, и вы получите ее. Также см .: [Динамическое распределение с помощью scanf()] (http://stackoverflow.com/questions/3911547/dynamic-allocation-with-scanf) –

Смежные вопросы