0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
1

Считывание чисел через пробел в массив через scanf

26.09.2011, 01:05. Показов 57200. Ответов 29
Метки нет (Все метки)

Здравствуйте!
Очень вероятно что вопрос поднимался миллионы раз, но я ответы не нашел спустя часы поиска
В общем задача следующая.
На стандартном потоке ввода задается последовательность целых чисел, по модулю не превосходящих 2*10^9. Последовательность состоит не менее чем из двух элементов.
Сколько всего чисел будет в последовательности - неизвестно.
Насколько я понимаю нужно записать каждый элемент в массив, но когда я использую просто scanf в переменную, а потом printf для этой же переменной - то выдается только первое число.
Последовательность целых чисел задается через пробел.
Какой то код выкладывать сюда думаю бессмысленно, потому что там только scanf и printf.

Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2011, 01:05
Ответы с готовыми решениями:

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

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

Из чисел в TEdit, записанных через пробел, заполнить массив
В поле ввода Edit имеется набор чисел через пробел. Как сделать что б по нажатию на кнопку из этих...

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

29
Каратель
Эксперт С++
6607 / 4026 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.09.2011, 01:44 2
Цитата Сообщение от swrko Посмотреть сообщение
Какой то код выкладывать сюда думаю бессмысленно, потому что там только scanf и printf.
и все же покажите ваш код, а то не совсем понятно что не так
0
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 01:59  [ТС] 3
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main (void)
{
long long c;
scanf("%lld", &c);
printf("%lld\n" , c);
return 0;
}
Таким образом показывается только первое число из всех введенных.
А если задаю переменную таким образом:
C
1
long long c[10];
то получаю ошибку
warning: format ‘%lld’ expects type ‘long long int *’, but argument 2 has type ‘long long int (*)[10]’
warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘long long int *’
Хотя вроде нельзя так считывать scanf в массив насколько я понимаю.

В общем никак не могу понять как мне добиться массива чисел.
Числа пользователь вводит сразу через пробел, энтер нажимает только в конце ввода всех чисел.
0
Заблокирован
26.09.2011, 02:00 4
Цитата Сообщение от swrko Посмотреть сообщение
На стандартном потоке ввода задается последовательность целых чисел, по модулю не превосходящих 2*10^9. Последовательность состоит не менее чем из двух элементов.
а поместить scanf в цикл не? можно и пробелами разделять, но без ентера, это отдельная история. есть на форуме тема
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int m[3], i = 0;
    for(; i < 3; ++i)
        scanf("%d", &m[i]);
 
    for(i = 0; i < 3; ++i)
        printf("%d", m[i]);
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 02:08  [ТС] 5
Цитата Сообщение от alkagolik Посмотреть сообщение
а поместить scanf в цикл не? можно и пробелами разделять, но без ентера, это отдельная история. есть на форуме тема
С удовольствием
Кстати сейчас попробовал запустить так, как вы написали. и у меня на убунту по крайней мере работает и с заданием через пробел.
Но вопрос такой - как создать динамический массив и заполнить его до тех пор, пока есть числа?
Тут можно написать что нибудь типа
C
1
while(scanf("%d", &m[i])!="\0")
или что то в этом духе.
И пока условие выполняется - заполнять массив?
0
Заблокирован
26.09.2011, 02:19 6
swrko, с заданием через пробел работает, но ентер все равно нажимать придется, потому что числа вводить можно до бесконечности. Не совсем понял что значит пока есть числа... можно это реализовать как линейный односвязный список.
C
1
2
3
4
struct list{
      int chislo;
      list *next;
}
0
593 / 531 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 02:22 7
можно и так.
и со статическим так тоже можно.
C
1
while(scanf("%d", &m[i++]));
надо будет в конце подать eof. в unix-e ctrl +d чтоли. и нажать ентер.
0
Заблокирован
26.09.2011, 02:24 8
наврал deleted
0
Каратель
Эксперт С++
6607 / 4026 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.09.2011, 02:24 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int *m = (int*)malloc(10 * sizeof(int))
        , i = 0, j = 0;
 
    while(scanf("%d", &m[i]) == 1 && ++i)
    {
        if (i % 9 == 0)
            realloc(m, (i + 10) * sizeof(int));
    }
    
    for(j = 0; j < i; ++j)
        printf("%d ", m[j]);
    
    free(m);
    return 0;
}
2
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 02:31  [ТС] 10
alkagolik,
на счет энтера - его просто нужно будет нажимать один раз - когда введут все числа, а не после каждого введенного числа. т.е. сейчас ввод работает как нужно.

Пока есть числа - я имел в виду создать массив из стольких элементов - сколько чисел введет пользователь.
Сейчас у нас конкретно указанный массив m[3]. Но он переполнится если чисел будет например 10.
Точнее цикл просто не дойдет до 10го элемента.
С объяснением всегда проблемы были, так понятнее вроде?

Добавлено через 6 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *m = (int*)malloc(10 * sizeof(int))
        , i = 0, j = 0;
 
    while(scanf("%d", &m[i++]) == 1)
    {
        if (i % 9 == 0)
            realloc(m, (i + 10) * sizeof(int));
    }
    --i;
    
    for(j = 0; j < i; ++j)
        printf("%d ", m[j]);
    
    free(m);
    return 0;
}
Это дело возвращает
warning: ignoring return value of ‘realloc’, declared with attribute warn_unused_result
C
1
while(scanf("%d", &m[i++]));
Так я тоже пробовал уже
Но программа как я понял зависает. потому что ничего просто не выполняется.
После нажатия на энтер так же стоит курсор в консоли и можно продолжать ввод чисел.
Но ничего не происходит.
0
Каратель
Эксперт С++
6607 / 4026 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.09.2011, 02:35 11
Цитата Сообщение от swrko Посмотреть сообщение
Это дело возвращает
это предупрежение, а не ошибка, 12-ю строку можно переписать так
C
1
m = (int*)realloc(m, (i + 10) * sizeof(int));
Добавлено через 57 секунд
Цитата Сообщение от swrko Посмотреть сообщение
Но программа как я понял зависает. потому что ничего просто не выполняется.
После нажатия на энтер так же стоит курсор в консоли и можно продолжать ввод чисел.
Но ничего не происходит.
вам же написали что
Цитата Сообщение от OstapBender Посмотреть сообщение
надо будет в конце подать eof. в unix-e ctrl +d чтоли. и нажать ентер.
0
Заблокирован
26.09.2011, 02:35 12
Цитата Сообщение от swrko Посмотреть сообщение
Это дело возвращает
хреновая у тебя бубунта))) обнови gcc у меня компилируется без проблем, тоже на бубунте
0
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 02:36  [ТС] 13
Jupiter, да, я обратил внимание, все равно запускал программу с тем кодом, но проблема такая же. После ввода чисел и нажатия на энтер ничего не происходит.
0
Заблокирован
26.09.2011, 02:37 14
Jupiter, как сгенерировать ctrl+d программно?

Добавлено через 39 секунд
Цитата Сообщение от swrko Посмотреть сообщение
Jupiter, да, я обратил внимание, все равно запускал программу с тем кодом, но проблема такая же. После ввода чисел и нажатия на энтер ничего не происходит.
ctrl+d потом enter
0
593 / 531 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 02:39 15
Jupiter, по-мойму правильно писать m = (int*)realloc(m, (i + 10) * sizeof(int));
1
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 02:44  [ТС] 16
Цитата Сообщение от alkagolik Посмотреть сообщение
ctrl+d потом enter
Тоже пробовал. Все равно ничего не выводит. Сейчас погуглим как gcc обновить еще

Добавлено через 4 минуты
На счет gcc кстати.
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
сильно старое?
0
Заблокирован
26.09.2011, 02:50 17
Цитата Сообщение от swrko Посмотреть сообщение
сильно старое?
в принципе нет, ты же не девелопер супер пупер, я тоже. ну как бэ код юпитера я проверил, запустил, оборвал с помощью ctrl+d... не знаю, товарищ, чем тебе помочь. у тебя в бубунтовых репах свежее должны быть версии. а репы gcc svn-новские. это отдельная история
0
593 / 531 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 02:53 18
alkagolik, например так
C
1
2
3
4
        keybd_event(VK_CONTROL, 0, 0, 0);
        keybd_event('D', 0, 0, 0);
        keybd_event('D', 0, KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);


Добавлено через 47 секунд
ну вместо старого keybd event майкрософт советует мессаджи использовать правда. но это не так важно.
1
0 / 0 / 0
Регистрация: 26.09.2011
Сообщений: 12
26.09.2011, 02:55  [ТС] 19
Цитата Сообщение от alkagolik Посмотреть сообщение
в принципе нет, ты же не девелопер супер пупер, я тоже. ну как бэ код юпитера я проверил, запустил, оборвал с помощью ctrl+d... не знаю, товарищ, чем тебе помочь.
Программа срабатывает, если в конце чисел дописать \0 и нажать энтер.
Странно почему без этого не работает.
0
Заблокирован
26.09.2011, 03:01 20
OstapBender, keyb_event ... иксы?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2011, 03:01
Помогаю со студенческими работами здесь

Scanner. Дописать считывание из файла записей через пробел
Помогите доделать код. Код: import java.util.Scanner; import java.lang.Math; import...

Чтение чисел через scanf
Хоть убей не могу заставить корректно работать функцию scanf. Стоит простая задача: ввести 2...

Динамический массив вводимый через scanf
Обыскал много тем но ответа не нашел, прошу помощи у вас, мои дорогие. Тема такая: Язык СИ, ввести...

Ввести числовые данные в двумерный массив через scanf
Столкнулся с интересным моментом. Нужно ввести числовые данные в двумерный массив через scanf....

Ввод чисел через пробел
Как-нибудь можно ввести числа в одну строку без использования массива? Я погуглил, но везде строка...

Ввод чисел через пробел
Доброго времени суток! Подскажите как правильно сделать. Есть односвязный список. Нужно вводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru