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

Содержимое удалено Содержимое добавлено
Char!1
Отмена правок до редакции 48657; →‎Проблемы: добавлены комментарии; оформление.
Строка 1:
== Проблемы ==
 
Здравствуйте. Откомпилировав и запустив программу обнаружил следующее:
 
1.# После ввода символа и нажатии клавиши ENTER, помимо введённого символа и его кода программа выдает сам символ ENTER, то есть переводит строку и печатает номер символа ENTER - 10. Чтобы от этого избавиться я добавил условие '''if (ch != 10)''' перед функцией printf.
2.# При нажатии ESC - программа продолжает работать. Видимо, программа особым образом обрабатывает символ ESC. Чтобы программа завершалась корректно, я заменил ESC на символ '!' (код 33).
3.# При компиляции программа выдаёт предупреждение: '''warning: return type of `main' is not `int''''
 
В моей редакции программа выглядит следующим образом:
2. При нажатии ESC - программа продолжает работать. Видимо, программа особым образом обрабатывает символ ESC. Чтобы программа завершалась корректно, я заменил ESC на символ '!' (код 33).
 
<source lang="c">
3. При компиляции программа выдаёт предупреждение:
#include <stdio.h>
 
void
'''warning: return type of `main' is not `char''''
void main ()
{
int ch;
do {
ch = getchar ();
if (ch != 10)
printf ("Вы нажали %c. ASCII код = %d\n", ch, ch);
} while (ch != 33);
}
</source>
 
{{Unsigned2 |2007-02-01 09:03:46|Rumynov}}
В моей редакции программа выглядит следующим образом:
 
: Попробуй использовать вместо функции getchar () функцию getchegetch () - она умеет обрабатывать ESC.
 
: [[Служебная:Contributions/85.173.101.210|85.173.101.210]] 07:26, 9 марта 2008 (UTC)Мимо проходил
#include <stdio.h>
:: Функция <code >getch ()</code> {{Якорь2 |не определена}} [[w:C11 |стандартом,]] так что такая программа потребует по меньшей мере использования библиотеки, подобной {{w |Ncurses}}. Кроме того, будет потеряна возможность использовать перенаправление [[w:Стандартные потоки#Стандартный ввод |стандартного ввода]] для получения кодов из файла (подобно: {{Cmdl |$ |decdump < file}}) или конвейера ({{Cmdl |$ |myprog &#124; decdump}}). — [[User:Ivan Shmakov|Ivan Shmakov]] ([[User talk:Ivan Shmakov|о]] ▞ [[Special:Contributions/Ivan Shmakov|в]]) 09:47, 16 апреля 2015 (UTC)
void main ()
{
int ch;
do {
ch = getchar();
if (ch != 10)
printf ("Вы нажали %c. ASCII код = %d\n", ch, ch);
}
while (ch = 33);
}
 
: У меня была похожая проблема; мой вариант решения: вместо void main () пишем просто int main () или int main (void) и потом return 0; в соотв. месте. (может быть это особенности диалектов c или компилятора gcc). [[Служебная:Contributions/94.50.187.3|94.50.187.3]] 15:48, 15 ноября 2009 (UTC) anonymous
Попробуй использовать вместо функции getchar() функцию getche() - она умеет обрабатывать ESC.
 
:: В текущей редакции кода эта проблема устранена; [[w:C11 |стандарт]] допускает объявление главной функции как <code >int main ()</code>, <code >int main (void)</code> или <code >int main (int argc, char *argv[])</code>. — [[User:Ivan Shmakov|Ivan Shmakov]] ([[User talk:Ivan Shmakov|о]] ▞ [[Special:Contributions/Ivan Shmakov|в]]) 09:47, 16 апреля 2015 (UTC)
[[Служебная:Contributions/85.173.101.210|85.173.101.210]] 07:26, 9 марта 2008 (UTC)Мимо проходил
 
мне: Мне кажется что проблему выдачи символа "«ENTER"» ("«символ переход на новую строчку"» он же "«newline"») можно избежать, если заставить программу просто считывать символ с клавиатуры, без необходимости подтверждения enter-ом (т. е. реакция по нажатию клавиши), вопрос только в том как это сделать...сделать…
У меня была похожая проблема; мой вариант решения: вместо void main() пишем просто int main() или int main(void) и потом return 0; в соотв. месте. (может быть это особенности диалектов c или компилятора gcc). [[Служебная:Contributions/94.50.187.3|94.50.187.3]] 15:48, 15 ноября 2009 (UTC) anonymous
 
: То ли это можно сделать стандартным методом (использование другой функции считывания символов или использовать getchar по-другому), то ли понадобиться писать отсебятину...[[Служебная:Contributions/89.20.107.198|89.20.107.198]] 17:22, 9 ноября 2009 (UTC) anomymous
 
: [[Служебная:Contributions/89.20.107.198|89.20.107.198]] 17:22, 9 ноября 2009 (UTC) anomymous
мне кажется что проблему выдачи символа "ENTER" ("символ переход на новую строчку" он же "newline") можно избежать, если заставить программу просто считывать символ с клавиатуры, без необходимости подтверждения enter-ом (т.е. реакция по нажатию клавиши), вопрос только в том как это сделать...
 
:: В рамках [[w:C11 |стандарта]], AFAIK, такая задача не решается. В остальном — см. [[#не определена |выше]]. — [[User:Ivan Shmakov|Ivan Shmakov]] ([[User talk:Ivan Shmakov|о]] ▞ [[Special:Contributions/Ivan Shmakov|в]]) 09:47, 16 апреля 2015 (UTC)
То ли это можно сделать стандартным методом (использование другой функции считывания символов или использовать getchar по-другому), то ли понадобиться писать отсебятину...[[Служебная:Contributions/89.20.107.198|89.20.107.198]] 17:22, 9 ноября 2009 (UTC) anomymous
Вернуться на страницу «Язык Си в примерах/ASCII-коды символов».