Еще придумал - рекомендуется после каждго scanf делать fflush (stdin) - для сброса всего того, что было забуферизированно в буфере консоли (если stdin связан с консолью) - вдруг Вы печатали быстрее, чем Ваша программа это обрабатывала?
Плохой совет.
http://www.gidnetwork.com/b-57.htmlДействительно плохой. В Builder 6.0 по поводу fflush написано следующее:
Цитата:
Flushes a stream.
If the given stream has buffered output fflush writes the output for stream to the associated file.
The stream remains open after fflush has executed. fflush has no effect on an unbuffered stream.
Т.е. действительно, ничего не сказано про input stream. Однако, в том же билдере в примере на использование scanf встречаем:
Код:
...
printf("\n\nPlease enter a label for the chart: ");
scanf("%20s", label);
fflush(stdin); /* flush the input stream in case of bad input */
...
Что в очередной раз доказывает кривость Builder'а.
За информацию спасибо, сам я этого не знал. Хотя, в полном согласии с
Цитата:
So what do you do if you can't use fflush()? Well, my first recommendation is not to use functions like scanf()* that love leaving junk in the input buffer. Find other ways to read your input and don't rely on functions that have unexpected anomalies or seemingly inconsistent results. Ouside of that, start checking returns from all your I/O functions (including scanf()) and start studying what functions actually do when input is not exactly as expected.
Your best bet, and I know this is beyond beginners so it's something to look forward to, you need to read a character buffer and parse the input yourself. There's only so much intelligence a canned C/C++ function can have. Until you can do this, you won't easily be able to create bulletproof input. Sorry.
функцией scanf не пользовался никогда в коммерческих проектах. Что-то подсознательное заставляло писать собственный простенький парсер
.