Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

agogo avatar agogo 12 Точки

Разчитане на код в C !

Здравейте!

Моля да ми помогнете в разчитането на следния ред и къде бъркам в прилагането му

while ( i < len && scanf("%d", &a[i++]) == 1);

Задача е всички елементи да се въведат в един ред с интервал помежду им. Проблемът идва от това, че цикълът не прекъсва докато не се въведе "Enter", независимо колко елемента въвеждам.

scanf("%d", &a[i++]) == 1

Не мога да си обясня напълно горния ред. scanf - чете число и при интервал го въвежда в масива, след което i се увеличава с едно и сочи следващия елемент. Би трябвало това да приключи при i = len(от по-горния ред), но не е така. След "Enter" масивът е запълнен с точния брой елементи, но въведените в повече оказват влияние на програмата. Сигурно има начини да се изчисти буфера.

Бих желал да използвам точно посочения фрагмен, ако разбира се е възможно!

Благодаря!

Тагове:
0
C Programming 18/12/2015 13:28:49
RoYaL avatar RoYaL Trainer 6849 Точки

Предполагам, че пост инкремента се изпълнява след проверката i < len. Пробвал ли си да преместиш scanf-а в ляво на условието и да ползваш пре-инкремент?

0
agogo avatar agogo 12 Точки

Пробвах!

Същия резултат!

Сложих тестов брояч да следи i и той спира да се увеличава при i = len, но въвеждането на числата не спира !!! :)

Опитах и външен цикъл, но той не може да прекъсне вътрешния!

Благодаря! 

0
mihayloff14 avatar mihayloff14 824 Точки

fseek(stdin,0,SEEK_END);

зачиства input buffer-а.

Проблемът идва от това, че като въведеш примерно 6 елемента, а очакваш 5, 6тия си стои в буфера и ако по-късно в програмата някъде четеш input отново, ще получиш като вход 6тия елемент, а не традиционен вход от клавиатурата.

Освен това, не може да ограничиш потребителя да спре да въвежда числа преди да натисне enter използвайки scanf. Това което искаш да постигнеш може да се направи с разни хакове. Например:

EDIT: http://codepaste.net/3cchtf

1
18/12/2015 14:34:47
agogo avatar agogo 12 Точки

Разбирам това!

Искам да разбера защо лявата част на условието е пасивна към i, докато се въвеждат елементите!
i очевидно расте и спира да расте при len, защо цикълът не приключва, като i < len вече не е истина и има ли начин да се прекъсне въвеждането при i = len в конкретния случай?

Може ли да ми дадеш насока, не искам решение!
Благодаря!
0
18/12/2015 14:37:17
mihayloff14 avatar mihayloff14 824 Точки

В конкретния случай - няма начин да се прекъсне четенето при въвеждане на дотатъчен брой елементи.

Съждението ти е следното:

i < len && scanf("%d", &a[i++]) == 1

когато i не изпълнява условието да е по-малко от len, цикъла прекъсва. Ако е по-малко се проверява следващата част от съждението, което е scanf. При scanf, програмата чака данни от стандартния вход, и ако те липсват (както в случая), приложението забива докато не бъдат въведени. И тези данни престават да бъдат въвеждани до момента в който не е натиснат enter. Тоест, четенето прекъсва до натискане на enter, а не до въвеждане на празен ред. 

Съответно, ако въведа 6 числа, а се очакват 5 - в буфера ще се въведат 6 числа и чак след това ще продължи изпълнението на програмата. След което scanf постепенно ще си прочете 5 числа, но 6тото ще остане в буфера

 

 

1
agogo avatar agogo 12 Точки

Сега бях малко навън и на чист въздух разбрах това, което си написал - прочетох го по-късно.

while ( i < len ) { scanf("%d", &a[i]); i++; }

Използвах това и то работи коректно, но условието бе елементите да са на един ред с интервал. Исках да използвам scanf, не fgets с strtol.

Хрумнаха ми някакви идеи за задаване размер на буфера(ако може) и това да прекъсва цикъла, но все оше съм на масиви. Като напредна ще опитам :)

Още веднъж благодаря!

П.С. Ще пиша ако успея някак да използвам scanf или sscanf в конкретния случай :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.