【问题标题】:getint and getchgetint 和 getch
【发布时间】:2010-01-03 15:32:33
【问题描述】:

“正如所写,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。我应该怎么做才能避免这种“问题”。

【问题讨论】:

  • 我们知道,这是作业问题吗?如果是这样,您的提问方式是正确的,通过发布您已经完成的工作并提出具体问题,但最好提及这是家庭作业,以便人们在回答时牢记这一点。
  • 如果您只提供一个字符的“放回”缓冲区,您不妨直接使用getcharungetc,而不是滚动您自己的getch/ungetch 对。我认为您的更改将需要多个“un-get”字符,但您的实现可能会提供这一点。
  • 不,这是 K&R 的一个练习,但我想从现在开始我会提到它。
  • 是的,我使用 getch 和 ungetch,因为书中暗示了这一点。不,我不需要超过一个字符的 unget,因为函数总是在 unget 一个字符后返回。
  • 这取决于你读到“推动这样一个角色”的内容。如果它表示“+”或“-”,那么您必须查看它后面的字符,确定它是非数字,然后将非数字和“+”或“-”推回读取缓冲。如果它仅表示非数字(可能是预期的),那么是的,只需要一个“un-get”字符。

标签: c pointers function


【解决方案1】:

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

  • 您可以在“缓冲区”中有一个字符数组,并在位置中有一个“索引”(即,有一个基本堆栈)。我相信到那时 K&R 中已经引入了数组。这将为您提供灵活性,因为您可以ungetch() 多个字符。此方案的另一个优点是,您在第 1 部分中的代码(您可能需要 ungetch() 两次)也变得更容易。
  • 您可以将“状态”存储在另一个 int 变量中,例如 int buffered = 0;,然后 getch() 将仅在 buffered == 1 时返回 bufungetch()buffered = 1getch()buffered = 0
静态int buf;
静态int缓冲= 0;

诠释 getch()
{
    如果(缓冲){
        缓冲 = 0;
        返回缓冲区;
    }
    返回 getchar();
}

无效 ungetch(int c)
{
    缓冲 = 1;
    缓冲区 = c;
}

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2020-05-02
    • 1970-01-01
    • 2012-05-14
    • 2015-10-08
    • 1970-01-01
    • 2015-06-02
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多