стандарт.

#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)

или 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
 Leigh14 дек. 2012 г., 22:34
Добро пожаловать в stackoverflow. Вы можете использовать{} вариант на панели инструментов для форматирования фрагментов кода для лучшей читаемости.

завершить вашу строку с '\ 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;
}
 schnaader23 янв. 2009 г., 21:39
Спасибо, исправил это.
 Nietzche-jou23 янв. 2009 г., 18:44
Пока вы исправляете вещи, вы можете ограничить цикл while на 19 итераций, сделать main () явно "int main (void)", очистить stdout после запроса printf () и вернуть значение.
 Nietzche-jou23 янв. 2009 г., 18:28
Это то же самое.
 schnaader23 янв. 2009 г., 18:30
Да, для символов «\ 0», NULL и 0 означают одно и то же, но использование «\ 0» делает его более понятным, согласованным и исправленным.
 jmanning2k23 янв. 2009 г., 18:19
Возможно, это проблема форматирования, но вы хотели завершить с нулем - "\ 0", верно ...

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

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

\ r \ n", перевод каретки (ввод) - "\ r"

Геч () это часть стандарта XSI Curses, выпущенного X-Open или OpenGroup и не имеющего отношения к Borlandconio.h заголовок.

Вы должны использоватьGetChar (3) или жеЕОКП (3)которые все они принадлежатИСО / МЭК 9899: 1990 стандарт. Оба вызова получают только один байт от управляющего терминала / консоли или входного потока соответственно.

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

Другой момент заключается в том, что на некоторых платформах необходимоstding поток, то вы должны применитьfflush (3) позвонить вSTDIN ручей.

fgets (3) а такжеfflush (3) принадлежит кИСО / МЭК 9899: 1990 стандарт.

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

scanf("%19s", name);

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

 Alnitak23 янв. 2009 г., 18:18
но только если вы хотите переполнения буфера ...
 chux16 мая 2017 г., 16:32
scanf("%19s", name); не будет работать для имен с пробелами в них,
 empi23 янв. 2009 г., 19:03
@Alnitak: я обновил код, чтобы предотвратить переполнение буфера, вы думали об этом или что-то не так с scanf?
 empi23 янв. 2009 г., 18:38
при использовании while вы можете получить такое же переполнение буфера, если не контролируете значение i. какая разница?

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

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

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

Ваш ответ на вопрос