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

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

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
mihayloff14 avatar mihayloff14 845 Точки

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 845 Точки

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

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

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