getint和getch

时间:2010-01-03 15:32:33

标签: c pointers function

“如上所述,getint将一个+或 - 后面的数字视为零的有效表示。修复它以将这样的字符推回输入。”

好的,这是原始版本:

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;
}

所以我不确定作者想要什么。我应该取消+/-以及之后的角色吗?如果在+/-或-1之后没有数字,我应该返回0吗?

我还有一个关于getch和ungetch函数的问题: 因为我的系统上的EOF是-1,这就是我写getch和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 :(得分:1)

要回答关于EOF-2的第二个问题,我可以考虑几个解决方案:

  • 你可以在“缓冲区”中有一个字符数组,并在该位置有一个“索引”(即,有一个基本的堆栈)。我认为那时阵列是在K& R中引入的。这将为您提供灵活性,您可以ungetch()多个角色。此方案的另一个优点是,您可能需要ungetch()两次的第1部分中的代码也变得更容易。
  • 您可以将'state'存储在另一个int变量中,例如int buffered = 0;,然后getch()仅在buf时返回buffered == 1ungetch()设置buffered = 1getch()设置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;
}