Завершить цикл while с помощью `getchar()`

Для моего домашнего задания мне нужно реализовать алгоритм Хорнера для преобразования между базами.

Мне сказали использовать getchar() для этого задания. Но у меня проблема: когда я нажимаю Enter, программа не завершается и просто принимает больше символов.

Пример:

bryce> ./pa1
Enter the fromRadix:16

Enter the toRadix:2
abc
abc
^C
bryce> 

Код:

int readRadixA(int radixA)
{
    char myChar = getchar(); 
    int result = 0; 
    int run = 0; 

    while(myChar != EOF)
    {
        if(myChar == "\n")
            break;

        Horners();

        myChar = getchar(); 
    }

    return result;
}

Я не прошу помощи в реализации Horners; Прошу помощи, чтобы правильно завершить getchar().


person Snow_Mac    schedule 04.02.2012    source источник
comment
Мне пришлось сделать ^C, чтобы завершить программу.   -  person Snow_Mac    schedule 04.02.2012
comment
Вы пробовали ^D, символ EOF в оболочках Unix? :) В Windows в этой роли может работать ^Z. Вы также можете закончить свою программу на двух \n подряд (то есть набрав пустую строку).   -  person 9000    schedule 04.02.2012
comment
getchar возвращает целое число. Не char, а int. myChar должен быть int.   -  person Mat    schedule 04.02.2012
comment
Я делаю это через Mac SSHed в Linux.   -  person Snow_Mac    schedule 04.02.2012
comment
спасибо @9000, твой ответ мне помог. я использую Debian 10 на виртуальном боксе 6.1.2   -  person Dev    schedule 28.02.2020


Ответы (5)


if(myChar=="\n")
           ^  ^

Вы сравниваете myChar неправильно. Попробуйте это вместо этого:

if(myChar == '\n') 
             ^  ^

Вторая проблема заключается в том, что getchar возвращает int, а не char. Может быть, вы можете переписать это так:

int myChar;
while((myChar = getchar()) != EOF && myChar != '\n')
{
    /* Your stuff. */
}

РЕДАКТИРОВАТЬ

В свете комментариев я думаю, что какая-то операция stdio до этого while оставляет \n в буфере.

Вместо scanf("%d", &radix) попробуйте:

scanf("%d ", &radix);
         ^

Это пространство заставит scanf съесть оставшиеся пробелы (включая новую строку).

person cnicutar    schedule 04.02.2012
comment
Я пробую это, и моя программа сразу же завершается после того, как я ввожу свои команды для ввода системы счисления от и до. Это означает, что я не могу ввести в get char. - person Snow_Mac; 04.02.2012
comment
@Snow_Mac Что ты ввел? Что вы ожидали ? - person cnicutar; 04.02.2012
comment
Программа подсказывает мне: введите fromRadix:, затем я набираю 16, затем она подсказывает: введите toRadix:, затем я набираю 2. После этого мой метод вызывается с помощью getchar(); который я должен быть в состоянии ввести abc. - person Snow_Mac; 04.02.2012
comment
Я делаю это через Mac SSHed в Linux. - person Snow_Mac; 04.02.2012
comment
@Snow_Mac: Могу поспорить, что код, который читается в fromRadix и toReadix (вернее, scanf()), оставляет '\n' в буфере, поэтому это первый символ, возвращаемый getchar() при выполнении readRadixA(). - person Michael Burr; 04.02.2012
comment
@Snow_Mac Я полностью согласен с Майклом Берром, я отредактировал свой ответ. - person cnicutar; 04.02.2012

Проверьте тип возвращаемого значения getchar(). Да, это int. Это потому, что EOF должно иметь значение, которое можно отличить от действительного символа. myChar нужно сделать int.

person FatalError    schedule 04.02.2012

Попробуйте этот код

int readRadixA(int radixA)
{
    char myChar;
    int result = 0; 
    int run = 0; 

    do
    {
        myChar = getchar(); 
        // implement horners here
    }while(myChar != 13);

    return result;
}
person Sunil Kumar B M    schedule 04.02.2012
comment
Что случилось с 13? Разве ты не знаешь, что это несчастье? - person Mateen Ulhaq; 04.02.2012
comment
13 - это значение ascii ключа ENTER - person Sunil Kumar B M; 04.02.2012
comment
Но это не сразу очевидно для тех, кто не запоминал свои таблицы ASCII. Кстати, это возврат каретки, а не клавиша Enter. Если вы настаиваете на том, чтобы не использовать '\r', по крайней мере используйте обычный 0x0D. Но опять же, перевод строки, 10, 0x0A или '\n' гораздо более стандартен, чем возврат каретки. - person Mateen Ulhaq; 04.02.2012

Я проверил ваш код, я думаю, вы оставляете «\ n» в буфере ввода клавиатуры после toRadix.

И это еще одна вещь, которая

 getchar()  

считывает все символы за один раз, пока не будет получен '\n'.

И есть еще одна ошибка, которую вы совершили, сравнив

   char to a pointer e.g  mychar=="\n"

дополнительная информация о вашей реализации toRadix может быть очень полезна для ответа на ваш вопрос.

person rakesh    schedule 04.02.2012

В Linux для завершения стандартного ввода необходимо ввести Ctrl-D. Ядро и уровни tty делают это меткой или условием конца файла. . Затем getchar дает EOF (что не является допустимым char, например, в системах, где char — это байты без знака от 0 до 255, EOF может быть -1).

Обратите внимание, что feof(3) допустим только после операции чтения (например, getchar, fgets и т. д.), поэтому кодирование while(feof(stdin)) обычно неверно (вопреки тому, что я написал в предыдущей версии этого ответа). Вам лучше проверить, что getchar возвращает EOF, поэтому ваш myChar должен быть int (а не char).

person Basile Starynkevitch    schedule 04.02.2012