|
|
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
штудирую K&R и C такой код из книги: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Поидее getchar должен ждать символ, если он не EOF, то выполняется putchar, если EOF - выход из while. Но все работает не так!?? Например я ввожу строку ddddddd, управление на putchar не пердается пока я не нажму ентер и на экране печатается ddddddd когда я нажимаю ентер передается управление на путчар и повторно выводится ddddddd (что переменная с типа int c содержит строку из нескольких символов ???) далее управление снова передпается на гетчар (как? я ведь нажал ентер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 12:50 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Нет, у тебя цикл выполняется несколько раз. В этом ты можешь убедиться установив дополнительный вывод на экран при каждой иттерации. Дело в том что поток ввода буферизуется, и буфер не будет поступать в getchar() пока не будет нажат enter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:03 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Я точно уже не помню. Вообще функция getchar не завершается пока не нажат enter. Операционная система хранит вводимую строку в буфере до тех пор пока не будет нажат enter, после того как enter нажат getchar получает этот буфер, и считывает из него по одному символу. Поэтому цикл начинает работать потом, и все символы выводятся после enter-a. И то что ты нажал enter, ето не значит что стандартный входной файл закончился, система читает в буфер следующую строку. Вот единственное чего я не знаю, это как из консоли ввести EOF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:04 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Но пример взят из книги Брайан В. Керниган, Деннис М. Ритчи и по описанию из нее пример должен работать так : Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:08 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
ХрякерНо пример взят из книги Брайан В. Керниган, Деннис М. Ритчи и по описанию из нее пример должен работать так : Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main. Все правельно. Здесь не описано, что функция getchar должна возвращать этот символ сразу же после того, как его ввел пользователь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:14 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
ХрякерНо пример взят из книги Брайан В. Керниган, Деннис М. Ритчи и по описанию из нее пример должен работать так : Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main. Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF) в консоли нет, это бесконечный файл. Я сам довольно долго мучился не мог понять в чем дело. Когда я откомпилировал эту прогу в линуксе, и запустил, перенаправив поток ввода, чтоб он шел из файла, то получил результат в точности соответствующий тому что описано в книге ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:14 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Хрякер пишет: > Например я ввожу строку ddddddd, > управление на putchar не пердается пока я не нажму ентер Правильно, так и должно быть. Буферизированный ввод, называется. getchar() читает из буфера входного потока ОДИН символ, но как эти символы попадают в буфер - это не его дело, а операционной системы. А операционка вводит только строками. > и на экране печатается ddddddd > когда я нажимаю ентер передается управление на путчар > и повторно выводится ddddddd Ты видимо спутал с функциями getch()/putch(), они небуферизированные, но и нестандартные. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:24 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Хрякер пишет: > Цикл while, пересылая в c полученное от getchar значение, сразу же > проверяет: не является ли оно “концом файла”. Если это не так, > выполняется тело цикла while и печатается символ. По окончании ввода > завершается работа цикла while, а тем самым и main. Так так все и работает!! Только еще ввод из OS вмешивается в процесс, а он в книге не описан. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:25 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
Sandro_K пишет: > Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF) > в консоли нет, это бесконечный файл. Ну да уж, сказки-то не надо рассказывать. Ctrl-Z нажимаешь, и вот он, конец файла CON. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:26 |
|
||
|
непонятки с getchar()(VC ++ 2005)
|
|||
|---|---|---|---|
|
#18+
MasterZiv Sandro_K пишет: > Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF) > в консоли нет, это бесконечный файл. Ну да уж, сказки-то не надо рассказывать. Ctrl-Z нажимаешь, и вот он, конец файла CON. Posted via ActualForum NNTP Server 1.4 Спасибо, не знал, просто давно когда-то я тож с этим примером мучился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2007, 13:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34634755&tid=2028576]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
179ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 472ms |

| 0 / 0 |
