Разчитане на код в C !
Здравейте!
Моля да ми помогнете в разчитането на следния ред и къде бъркам в прилагането му
while ( i < len && scanf("%d", &a[i++]) == 1);
Задача е всички елементи да се въведат в един ред с интервал помежду им. Проблемът идва от това, че цикълът не прекъсва докато не се въведе "Enter", независимо колко елемента въвеждам.
scanf("%d", &a[i++]) == 1
Не мога да си обясня напълно горния ред. scanf - чете число и при интервал го въвежда в масива, след което i се увеличава с едно и сочи следващия елемент. Би трябвало това да приключи при i = len(от по-горния ред), но не е така. След "Enter" масивът е запълнен с точния брой елементи, но въведените в повече оказват влияние на програмата. Сигурно има начини да се изчисти буфера.
Бих желал да използвам точно посочения фрагмен, ако разбира се е възможно!
Благодаря!
Разбирам това!
В конкретния случай - няма начин да се прекъсне четенето при въвеждане на дотатъчен брой елементи.
Съждението ти е следното:
i < len && scanf("%d", &a[i++]) == 1
когато i не изпълнява условието да е по-малко от len, цикъла прекъсва. Ако е по-малко се проверява следващата част от съждението, което е scanf. При scanf, програмата чака данни от стандартния вход, и ако те липсват (както в случая), приложението забива докато не бъдат въведени. И тези данни престават да бъдат въвеждани до момента в който не е натиснат enter. Тоест, четенето прекъсва до натискане на enter, а не до въвеждане на празен ред.
Съответно, ако въведа 6 числа, а се очакват 5 - в буфера ще се въведат 6 числа и чак след това ще продължи изпълнението на програмата. След което scanf постепенно ще си прочете 5 числа, но 6тото ще остане в буфера
Сега бях малко навън и на чист въздух разбрах това, което си написал - прочетох го по-късно.
while ( i < len ) {
scanf("%d", &a[i]); i++; }
Използвах това и то работи коректно, но условието бе елементите да са на един ред с интервал. Исках да използвам scanf, не fgets с strtol.
Хрумнаха ми някакви идеи за задаване размер на буфера(ако може) и това да прекъсва цикъла, но все оше съм на масиви. Като напредна ще опитам :)
Още веднъж благодаря!
П.С. Ще пиша ако успея някак да използвам scanf или sscanf в конкретния случай :)