Почему нажатие клавиши ввода не возвращает '\ n' в getch ()? - PullRequest
5 голосов
/ 23 января 2009
#include <stdio.h>
#include <conio.h>
main()
{
    char ch,name[20];
    int i=0;
    clrscr();
    printf("Enter a string:");
    while((ch=getch())!='\n')
    {
        name[i]=ch;
        i++;
    }
    name[i] = '\0';
    printf("%s",name);
}

Когда я даю «abc» в качестве ввода и если я нажимаю ввод, он не работает. Может кто-нибудь сообщить мне, почему условие ch = getch ()! = '\ N' не становится ложным, когда я нажимаю ввод? Я также заметил, что ch принимает \ r вместо \ n. Пожалуйста, дайте мне знать. Спасибо

Ответы [ 9 ]

9 голосов
/ 23 января 2009

Используйте '\ r' и завершите вашу строку с '\ 0'.

Кроме того, вы можете попытаться использовать getche (), чтобы дать пользователю визуальное эхо и внести некоторые другие общие исправления:

#include <stdio.h>
#include <conio.h>

#define MAX_NAME_LENGTH 20

int main()
{
    char ch, name[MAX_NAME_LENGTH];
    int i=0;
    clrscr();
    printf("Enter a string:");
    while ( ((ch=getche())!='\r') && (i < MAX_NAME_LENGTH - 1) )
    {
        name[i]=ch;
        i++;
    }
    name[i] = '\0';
    printf("%s\n",name);

    return 0;
}
5 голосов
/ 23 января 2009

Попробуйте \ r вместо \ n

\ n - символ новой строки (0x0A) или 10 десятичных знаков, \ r - символ возврата каретки (0x0D) или 13 десятичных знаков.

Ключ возврата - возврат каретки.

4 голосов
/ 16 августа 2010

Клавиша возврата клавиатуры - возврат каретки, или CR. Это можно найти, запустив программу и проанализировав результаты.

Когда вы нажимаете клавишу ввода, значение ASCII клавиши ввода не возвращается, вместо этого возвращается CR.

Следовательно, (ch=getch())!='\n' следует заменить на любое из следующих эквивалентных утверждений:

ch=getch())!='\r' 
ch=getch())!=13     // ASCII for CR: decimal
ch=getch())!=0xd     // hexadecimal for CR
ch=getch())!=0xD     // hexadecimal for CR
ch=getch())!=015     // octal for CR
1 голос
/ 23 января 2009

Это потому, что клавиша возврата на клавиатуре внутренне представлена ​​как '\ r', а не '\ n'. Чтобы этот конкретный пример работал, вместо этого вам нужно перехватить '\ r'.

0 голосов
/ 09 августа 2012

Фактическое значение \n равно \r + \n. getch() Функция читает символ с клавиатуры.
Он не повторяет его и не ждет следующего символа.
Поэтому всякий раз, когда мы вводим \n символ getch(), функция читает \r только символ.

0 голосов
/ 23 января 2009

Это зависит от вашей системы. Также вы должны знать, что getch () является частью стандарта XSI Curses, выпущенного X-Open или OpenGroup и не относящегося к специфическому для Borland заголовку conio.h .

Вы должны использовать getchar (3) или getc (3) , которые все они относятся к ISO / IEC 9899: 1990 стандарт. Оба вызова получают только один байт от управляющего терминала / консоли или входного потока соответственно.

Если вы вызываете их с платформы Windows, вы получаете ключ Enter, последовательность '\ r', '\ n' , а не просто '\ n'. Затем вы должны создать цикл вокруг вызовов getchar (3) или getc (3) . Кроме того, вызов fgets (3) over stdin будет работать для получения последовательности '\ r', '\ n' .

Еще один момент: некоторые платформы должны очищать поток stding , тогда вы должны применить вызов fflush (3) к потоку stdin .

fgets (3) и fflush (3) относится к стандарту ISO / IEC 9899: 1990 .

0 голосов
/ 23 января 2009

Я думаю, что было бы лучше просто использовать:

scanf("%19s", name);

вместо того, чтобы получить вещь.

0 голосов
/ 23 января 2009

В Windows ввод действительно "\ r \ n" (перевод каретки и перевод строки) Я думаю, getchar () вернет '\ n'.

0 голосов
/ 23 января 2009

в некоторых системах символ новой строки - "\ r \ n", перевод каретки (ввод) - "\ r"

...