Обсуждение:Язык Си в примерах/ASCII-коды символов

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Проблемы[править]

Здравствуйте. Откомпилировав и запустив программу обнаружил следующее:

  1. После ввода символа и нажатии клавиши ENTER, помимо введённого символа и его кода программа выдает сам символ ENTER, то есть переводит строку и печатает номер символа ENTER — 10. Чтобы от этого избавиться я добавил условие if (ch != 10) перед функцией printf.
  2. При нажатии ESC - программа продолжает работать. Видимо, программа особым образом обрабатывает символ ESC. Чтобы программа завершалась корректно, я заменил ESC на символ '!' (код 33).
  3. При компиляции программа выдаёт предупреждение: warning: return type of `main' is not `int'

В моей редакции программа выглядит следующим образом:

#include <stdio.h>

void
main ()
{
  int ch;
  do {
    ch = getchar ();
    if (ch != 10)
      printf ("Вы нажали %c. ASCII код = %d\n", ch, ch);
  } while (ch != 33);
}

— Это сообщение написано Rumynov (о · в) 2007-02-01 09:03:46 (UTC)

Попробуй использовать вместо функции getchar () функцию getch () - она умеет обрабатывать ESC.
85.173.101.210 07:26, 9 марта 2008 (UTC) Мимо проходил
Функция getch () не определена стандартом, так что такая программа потребует по меньшей мере использования библиотеки, подобной Ncurses. Кроме того, будет потеряна возможность использовать перенаправление стандартного ввода для получения кодов из файла (подобно: $ decdump < file) или конвейера ($ myprog | decdump). — Ivan Shmakov (ов) 09:47, 16 апреля 2015 (UTC)
Мне кажется что проблему выдачи символа «ENTER» («символ переход на новую строчку» он же «newline») можно избежать, если заставить программу просто считывать символ с клавиатуры, без необходимости подтверждения enter-ом (т. е. реакция по нажатию клавиши), вопрос только в том как это сделать…
То ли это можно сделать стандартным методом (использование другой функции считывания символов или использовать getchar по-другому), то ли понадобиться писать отсебятину...
89.20.107.198 17:22, 9 ноября 2009 (UTC) anomymous
В рамках стандарта, AFAIK, такая задача не решается. В остальном — см. выше. — Ivan Shmakov (ов) 09:47, 16 апреля 2015 (UTC)
У меня была похожая проблема; мой вариант решения: вместо void main () пишем просто int main () или int main (void) и потом return 0; в соотв. месте. (может быть это особенности диалектов c или компилятора gcc). 94.50.187.3 15:48, 15 ноября 2009 (UTC) anonymous
В текущей редакции кода эта проблема устранена; стандарт допускает объявление главной функции как int main (), int main (void) или int main (int argc, char *argv[]). — Ivan Shmakov (ов) 09:47, 16 апреля 2015 (UTC)