scanf() нет возврата каретки после printf()

#c #console #scanf #newline #conemu

#c #консоль #scanf #новая строка #conemu

Вопрос:

У меня есть следующий код, который считывает 4 числа из пользовательского ввода:

 #include <stdio.h>
#include <stdlib.h>

#define MAX_NUMS 4

int main()
{
    int nums[MAX_NUMS];

    int i;
    int num;

    for (i = 0; i < MAX_NUMS; i  )
    {
        do
        {
            printf("Enter a value between 1 and 9: ");
            scanf("%i",amp;num);
        }
        while(num > 9 || num < 1);

        nums[i] = num;
    }

    return 0;
}
 

И когда я его запускаю, я получаю следующий вывод:

 user@USER:/cygdrive/d
$ ./test.exe
Enter a value between 1 and 9: 1
                                Enter a value between 1 and 9: 2
                                                                Enter a value between 1 and 9: 3
                                                                                                Enter a value between 1 and 9: 4
                                                                                                                                user@USER:/cygdrive/d
$
 

Почему нет возврата каретки, когда я нажимаю enter после ввода чисел? Я что-то упускаю?

Я на cygwin:

 user@USER:/cygdrive/d
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/9.3.0/lto-wrapper.exe
Target: x86_64-pc-cygwin
Configured with: /cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-9.3.0-2.x86_64/src/gcc-9.3.0 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=c,c  ,fortran,lto,objc,obj-c   --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --enable-libquadmath --enable-libquadmath-support --disable-libssp --enable-libada --disable-symvers --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id --with-default-libstdcxx-abi=gcc4-compatible --enable-libstdcxx-filesystem-ts
Thread model: posix
gcc version 9.3.0 (GCC)
user@USER:/cygdrive/d
$ uname -a
CYGWIN_NT-10.0 STEPAN 3.1.5(0.340/5/3) 2020-06-01 08:59 x86_64 Cygwin
user@USER:/cygdrive/d
$ echo $TERM
xterm-256color
 

Комментарии:

1. Похоже на проблему терминала, как printf("HellonWorldn"); выглядит вывод?

2. Это не выполняется C, это драйвер терминала, который не переходит к началу строки после нажатия клавиши Enter.

3. @RobertoCaboni r просто перемещает каретку в начало, и когда я ввожу число, оно переопределяет существующий вывод.

4. @Barmar итак, что я могу сделать? Я использую терминал ConEmu

5. Я понятия не имею, я не использую Windows или Cygwin.

Ответ №1:

Похоже, что в вашей конкретной среде клавиша ввода, которую вы нажимаете для подтверждения ввода, интерпретируется как необработанная 'n' . На самом деле первоначальное значение этого символа — перевод строки, что означает «изменить строку без выполнения возврата каретки» ( 'r' ).

В большинстве терминалов клавиша enter суммирует эффекты r и n , и в вашем случае этого не происходит.

Чтобы обойти это, попробуйте вставить вручную a 'r' после ввода ввода:

 do
{
    printf("Enter a value between 1 and 9: ");
    scanf("%i",amp;num);
    printf("r");
}
while(num > 9 || num < 1);

 

Комментарии:

1. Рабочее решение для моего конкретного кода. Но все еще нет решения проблемы с ConEmu.