2010-01-03 4 views
1

«Как указано, getint обрабатывает символ« + »или« не следует цифрой как допустимое представление нуля ». Исправьте ее, чтобы направить такой символ на вход».getint и getch

Хорошо, хорошо это оригинальная версия:

int getint2(int *pn) 
{ 
    int c, sign; 

    while(isspace(c=getch())) 
     ; 

    if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') { 
      ungetch(c); 
      return 0; 
    } 

    sign = (c == '-') ? -1 : 1; 

    if(c == '+' || c == '-') { 
     c = getch(); 
    } 

    for(*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 

    *pn *= sign; 
    ungetch(c); 
    return c; 
} 

И я редактировал этот путь:

int getint2(int *pn) 
{ 
    int c, sign; 

    while(isspace(c=getch())) 
     ; 

    if(!isdigit(c) && c!= EOF && c!= '+' && c!= '-') { 
      ungetch(c); 
      return 0; 
    } 

    sign = (c == '-') ? -1 : 1; 

    if(c == '+' || c == '-') { 
     c = getch(); 

     if(!isdigit(c)) { 
     ungetch(c); 
     return 0; 
     } 
    } 

    for(*pn = 0; isdigit(c); c = getch()) 
     *pn = 10 * *pn + (c - '0'); 

    *pn *= sign; 
    ungetch(c); 
    return c; 
} 

Так я не уверен, что сделал автор хочет. Должен ли я отключить +/- или просто персонаж после него? Должен ли я вернуть 0, если нет цифр после +/- или -1?

У меня тоже есть вопрос о Геч и ungetch функций: поскольку EOF на моем Sistem является -1, это, как я писал Геч и ungetch:

int buf = EOF; 

int getch() 
{ 
    int temp; 

    if(buf == -2) 
     return EOF; 

    if(buf == EOF) 
     temp = getchar(); 
    else 
    { 
     temp = buf; 
     buf = EOF; 
    } 

    return temp; 
} 

void ungetch(int c) 
{ 
    if(c == EOF) 
     buf = -2; 

    buf = c; 
} 

Так мне сказали, что некоторые люди, что EOF может быть -2. Что я должен делать, чтобы избежать такой «проблемы».

+1

Только так мы знаем, это проблема домашних заданий? Если это так, вы попросили его правильно, разместив работу, которую вы уже сделали, и зададите конкретные вопросы, но также полезно отметить, что это домашнее задание, чтобы люди могли это учитывать при ответе. –

+0

Если вы предоставляете только один символ буфера «обратно», вы можете использовать 'getchar' и' ungetc' напрямую, вместо того, чтобы перематывать свою собственную 'getch' /' ungetch'. Я думаю, что для ваших изменений потребуется более одного символа «un-get», но ваша реализация может обеспечить это. –

+0

Нет, это упражнение от K & R, но я думаю, что теперь я говорю об этом. – Tool

ответ

1

Чтобы ответить на ваш второй вопрос, о EOF и -2, я могу думать о двух решений:

  • вы могли бы иметь массив символов в «буфер», и «индекс» в (т. е. иметь рудиментарный стек). Я считаю, что массивы введены в K & R к этому моменту. Это даст вам гибкость в том, что вы можете ungetch() более одного символа. Дополнительным преимуществом этой схемы является то, что ваш код в части 1, где вам может понадобиться ungetch(), станет проще.
  • вы можете сохранить «состояние» в другой переменной int, например int buffered = 0;, а затем getch() вернет buf только тогда, когда buffered == 1. ungetch() наборы buffered = 1, getch()buffered = 0 наборы:
static int buf; 
static int buffered = 0; 

int getch() 
{ 
    if (buffered) { 
     buffered = 0; 
     return buf; 
    } 
    return getchar(); 
} 

void ungetch(int c) 
{ 
    buffered = 1; 
    buf = c; 
}
Смежные вопросы