Завершите цикл while, используя `getchar ()` - PullRequest
2 голосов
/ 04 февраля 2012

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

Мне сказали использовать 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() правильно.

Ответы [ 5 ]

5 голосов
/ 04 февраля 2012
if(myChar=="\n")
           ^  ^

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

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

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

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

EDIT

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

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

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

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

1 голос
/ 04 февраля 2012

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

0 голосов
/ 04 февраля 2012

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

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

 getchar()  

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

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

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

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

0 голосов
/ 04 февраля 2012

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

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

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

    return result;
}
0 голосов
/ 04 февраля 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).

...