Титла: getchar() не работи от пъривя път. Публикувано от: completer в Aug 31, 2009, 14:38 Ето какво става!Първо мислех, че ще мога да използвам gethce(); но се оказа, че тя била само за бъгиндоулс(whatever :P). Та реших, че getchar() ще свърши работата,но възникна проблем.В прогрмата която съм написал съм го поставил в цикъл while за проверка дали вкарва верен знак. Там е работата че при първото изпълнение на цикъла пропуска ch=getchar(); а чак при второто изпълнение се изпълнява getchar().Реших да направя пробна програма със същият цикъл да видя какво ще стане, интересното тук беше че се изпълни както трябва но само първия път ! Ето вижте сорса на пробната програма за да ме разберете по-добре.
Код
Ето какво става при пускането на пробната програма Код: completer@debian:~/C Programing/Matrux$ ./a.out Ето пък какво става при въпросната ми прогрма Код: Please enter the values of the first matrix in the following order: P.S. Моля не ме критикувайте като програмист все още се уча от една книга и реших да изпробвам натрупаните досега знания. Титла: Re: getchar() не работи от пъривя път. Публикувано от: romeo_ninov в Aug 31, 2009, 15:01 1. преди използване инициализирай променливата ch
2. while сравнението (мисля) трябва да е от вида while(ch!='n' && ch!='y').... Титла: Re: getchar() не работи от пъривя път. Публикувано от: bop_bop_mara в Aug 31, 2009, 15:05 Извинявай, ама няма как да се мине без критика... Прочети много внимателно за функциите, как се извикват, за стека на извикванията и рекурсията... Връщането във функцията, от която си извикал дадена функция, не става с нейно извикване или с goto, става с изход от извиканата функция. Ти имаш функция А, която вика функция Б, която вика А и т.н. - на това му се вика косвена рекурсия.
mara@OVNI:~$ ./a.out HELLO ENTER Go back to main menu? (y/n)y HELLO ENTER Go back to main menu? (y/n)Go back to main menu? (y/n)y HELLO ENTER Go back to main menu? (y/n)Go back to main menu? (y/n)y HELLO ENTER Go back to main menu? (y/n)Go back to main menu? (y/n)n Exitting.. Go back to main menu? (y/n)Go back to main menu? (y/n)n Exitting.. Go back to main menu? (y/n)Go back to main menu? (y/n)n Exitting.. Go back to main menu? (y/n)Go back to main menu? (y/n)n Exitting.. mara@OVNI:~$ Ето ти още един резултат от изпълнението с два пъти "y". Като прочетеш за извикванията на функции и си начертаеш схема на това, което правиш, сам ще си обясниш това, което се получава. И не забравяй, че програмите винаги работят правилно, просто програмистите им казват да правят грешни неща ;) ПС. Коя е тая книга, дето четеш от нея? Гледам 2рата функция ти е тип int и завършва с return 0, новите C стандарти не изискват такова нещо, има си тип void за функция.. Титла: Re: getchar() не работи от пъривя път. Публикувано от: ludsic в Aug 31, 2009, 15:31 Има грешка в кода който написах така че го изтрих ...
Поздрави :) Титла: Re: getchar() не работи от пъривя път. Публикувано от: neter в Aug 31, 2009, 15:38 completer, един съвет от мен - извеждай си съдържанието на променливата "ch" през различните стъпки на кода, и с малко логика ще видиш къде грешиш ;)
Титла: Re: getchar() не работи от пъривя път. Публикувано от: Iron_steel в Aug 31, 2009, 15:45 Промених си мнението,не схванах идеята. ;D
Титла: Re: getchar() не работи от пъривя път. Публикувано от: ludsic в Aug 31, 2009, 15:51 точно това бях написал и аз но примерно може да натиснеш "d" и тогава няма да изкара никакво съобщение а чака да натиснеш "y" или "n"
Edit: ХАХАХААХАХ много промени станаха :D Титла: Re: getchar() не работи от пъривя път. Публикувано от: completer в Aug 31, 2009, 16:10 Извинявай, ама няма как да се мине без критика... Прочети много внимателно за функциите, как се извикват, за стека на извикванията и рекурсията... Връщането във функцията, от която си извикал дадена функция, не става с нейно извикване или с goto, става с изход от извиканата функция. Ти имаш функция А, която вика функция Б, която вика А и т.н. - на това му се вика косвена рекурсия. Първо благодаря на всички за отговорите!!! Ето я въпросната книга http://www.bulbooks.com/book-1451.html ($2) много съм доволен от нея! Всъщност още не съм чел за нещата които спомена по-горе, до тук което съм чел за функциите е как се създават такива и как се извикват останалото видято в кода ми е плод на развинтената ми логика ;D.Просто както казах в началото реших с натрупаните до сега знания да ги инвестирам в някаква програма.Напълно ми е ясно,че няма да стане нещо качествено с това което имам до сега, но предполагам и вие сте минали през този път, просто исках да опитам. :) Титла: Re: getchar() не работи от пъривя път. Публикувано от: completer в Aug 31, 2009, 16:20 1. преди използване инициализирай променливата ch Интересно дори и с инициализация не проработи(или пак греша здраво) Код: char ch; Титла: Re: getchar() не работи от пъривя път. Публикувано от: Arvigeus в Aug 31, 2009, 16:27 Пробвай вместо ch=getchar(); да използваш scanf("%c", &ch);
И изполлзвай do-while, така поне ще се изпълни най-малко веднъж... Титла: Re: getchar() не работи от пъривя път. Публикувано от: Nikolavp в Aug 31, 2009, 16:54 Пробвай вместо ch=getchar(); да използваш scanf("%c", &ch);scanf не е хубаво изобщо да се ползва за каквото и да е, което не е тестови код :). Титла: Re: getchar() не работи от пъривя път. Публикувано от: Iron_steel в Aug 31, 2009, 18:05 Хайде някои да реши проблема. ??? ???
Дай да видим сорса на другата програма. Титла: Re: getchar() не работи от пъривя път. Публикувано от: ludsic в Aug 31, 2009, 19:31 Ето го и решението ( не е с getchar но все пак ...)
Код
Изход : Код
Проблема до колкото разбрах е в това че изпълнява цикала 2 пъти без да пита за вход който се реши със scanf(...); и getchar(); Поздрави ПС: сега пробвах и видях че няма нужда от замяната със scanf(...); може да се ползва и ch=getchar(); въпрос на избор :) ПСС: и на ред 17 може да се сложи getchar(); и да се изтрият другите 2 по-долу ... пак работи Титла: Re: getchar() не работи от пъривя път. Публикувано от: Iron_steel в Aug 31, 2009, 20:55 Ето още един вариант,обаче е написан с библиотеката ncurses.
Код Тук не трябва да се натиска Enter за потвърждаване на избора,тъй като getch() е интерактивна.Проблема при getchar() e че, след като въведеш знака и натиснеш Enter знака за нов ред остава в клавиатурния буфер.Поне Аз така си мисля,поправете ме ако греша. За да компилирате кода Код: gcc foo.c -lncurses Дано не съм объркал някой. Все още се уча на ncurses.Може да има нещо пропуснато. Титла: Re: getchar() не работи от пъривя път. Публикувано от: romeo_ninov в Aug 31, 2009, 22:10 Iron_steel, много си прав, именно в тази функция е проблема :)
completer, използвай getc() за да получиш един символ от STDIN :) Именно знака за нов ред е причината за изпълнение на printf("Go back to main menu? (y/n)"); Титла: Re: getchar() не работи от пъривя път. Публикувано от: b2l в Aug 31, 2009, 22:15 Аз бих завъртял do...while цикъл.
Титла: Re: getchar() не работи от пъривя път. Публикувано от: completer в Aug 31, 2009, 23:19 Благодаря на всички за отговорите!!!
Така да кажа какво става. Пробвах начина на ludsic и той се получи. Обаче нещо не ми се върза номера на romeо_ninov извинявай ако изглеждам глупаво като задам този въпрос но така ли трябва да изглежда фрагмента от прогрмата Код
питам защото по този начин getc също чака за връщане на каретката демек Enter :) А доколкото за начина на Iron_steel ще ми трябва малко повече време да го осмисля защото още не съм работил с ncurses. Титла: Re: getchar() не работи от пъривя път. Публикувано от: dvasilev в Sep 01, 2009, 21:20 @completer: Предполагам, това ти трябва.
Код Разликата спрямо твоя вариант е, че като прочете знака за край на ред, не извежда съобщение. Освен това имай предвид, че getchar връща int, а не char. Също така не ми е ясно какво се очаква да се случи при въвеждане на 'yyy', 'ynn', 'yrrn' или други подобни комбинации. Едно съм сигурен, че този вариант се държи доста по-консистентно, от примера в книгата. Също така, като ще четеш символ по символ, по-добре си направи краен автомат. Код В този пример въвеждането на повече от един символ се счита за невалидно. Титла: Re: getchar() не работи от пъривя път. Публикувано от: ludsic в Sep 02, 2009, 00:05 //offtopic
хихи! краен автомат :) аре да ми вземеш изпита по дискретна :D Титла: Re: getchar() не работи от пъривя път. Публикувано от: gat3way в Sep 02, 2009, 00:14 Забравихте да проверявате и за главни букви :)
Титла: Re: getchar() не работи от пъривя път. Публикувано от: completer в Sep 03, 2009, 00:16 Блаодаря на всички за отзивите!!! Изглежда начина на dvasilev e най-удачен за сегашнто ми състояние на приетите знания от книгата.Сега вече ще си довърша програмата, която всъщност е за решаване на матрици по висша математика.Благодаря много пак на всички !
Титла: Re: getchar() не работи от пъривя път. Публикувано от: bop_bop_mara в Sep 03, 2009, 00:58 //offtopic
Не я довършвай, за твое добро... ;) Титла: Re: getchar() не работи от пъривя път. Публикувано от: completer в Sep 03, 2009, 10:54 //offtopic
решил съм че сега ще я довърша,а после след като почна да уча за масиви и те подобни да я подобрвам след всеки раздел, така ще направя голяма разлика между нещата. |