0

我正在自己练习 C 编程。我编写的程序是一个 getfloat,它将字符流转换为浮点数(来自 K&R 练习 5-2)。我使用了书中的代码片段,它们使用 getch 和 ungetch 从缓冲区或输入中获取下一个字符。我的代码的问题是,我正在编写的 Visual Studio 在正确进行计算和转换后无法打印出该值。我进入程序,发现我函数中的变量 c 在转换结束时变成了 -1 而不是 10,正如假设的那样。这是我的代码:

#include <stdio.h>
#include <ctype.h>

int getch(void);
void ungetch(int c);
int getfloat(float *pn);
int main(void)
{
int ret;

    float f;
    printf("enter a float number:\n");
    ret=getfloat(&f);
    if(ret>0)
        printf("you've entered: %f",f);

if (ret == EOF) 
{
      puts("Stopped by EOF.");
} 
else 
{
      puts("Stopped by bad input.");
}

return 0;
}

int getfloat(float *pn)
{
 char c,sign,dec;
 float pow;
 while(isspace(c=getch()))
     ;
 if(!isdigit(c)&&c!=EOF&&c!='-'&&c!='+'&&c!='.')
 {
     ungetch(c);
     return 0;
 }
 sign=(c=='-')?-1:1;
 if(c=='-'||c=='+')
      c=getch();
 if(!isdigit(c))
 {
     ungetch(c);
     return -1;
 }
 for(*pn=0;c!=EOF && isdigit(c);c=getch())
     *pn=10* (*pn)+ (c-'0');  //calculate the integer part//

 if((c=getch())=='.')
 {
     for(*pn,dec=1;c!=EOF && isdigit(c);c=getch())
     {
         *pn=10* (*pn)+ (c-'0');  //calculate the decimal part//
         dec=dec*10;
     }
     *pn=*pn*sign/dec;
 }

 if((c=getch())=='e')
 {
      if((c=getch())=='-')
         for(*pn,pow=0.1;c!=EOF && isdigit(c);c=getch())
     {
         *pn=10* (*pn)+ (c-'0');  
         dec=dec/10;
     }
     else 
     {
         ungetch(c);
         for(*pn,pow=1.0;c!=EOF && isdigit(c);c=getch())
         {
             *pn=10* (*pn)+ (c-'0');  
             dec=dec*10;
         }
     }
*pn=*pn*sign*dec;
 }
if(c!=EOF)
    ungetch(c);
return c;
 }




#define BUFSIZE 100

char buf[BUFSIZE];      /* bufer for ungetch */
int bufp = 0;           /* next free position in buf */

 int getch(void)         /* get a (possibly pushed-back) character */
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c)     /* push character back on input */
{
       if (bufp >= BUFSIZE)
              printf("ungetch: too many characters\n");
      else
              buf[bufp++] = c;
}
4

3 回答 3

2

你的程序有太多问题。这里有几个:

dec=dec*10;

您的程序中有一些有效的代码路径dec未初始化。

char c,sign,dec;

/* ... */ 

if(c!=EOF)

EOF是否定的int,因此c必须将其声明为intnot as a char

于 2013-07-05T10:06:52.653 回答
0
int getfloat(float *pn){
    int c,sign,dec;
    float pow, tmp;

    while(isspace(c=getch()))
        ;
    if(!isdigit(c) && c!=EOF && c!='-' && c!='+'){//&&c!='.'
        ungetch(c);
        return 0;
    }
    sign=(c=='-')?-1:1;
    if(c=='-'||c=='+')
        c=getch();
    if(!isdigit(c)){
        ungetch(c);
        return -1;
    }
    for(*pn=0;c!=EOF && isdigit(c);c=getch())
        *pn = 10* (*pn)+ (c-'0');  //calculate the integer part//
    *pn *= sign;

    if(c=='.'){
        c = getch();
        tmp=0;
        for(dec=1;c!=EOF && isdigit(c);c=getch()){
            tmp=10 * tmp + (c-'0');  //calculate the decimal part//
            dec=dec*10;
        }
        *pn = *pn + sign * tmp / dec;
    }

    if(c=='e'){
        c=getch();
        sign=(c=='-')?-1:1;
        if(c=='-')
            c=getch();
        for(tmp=0;c!=EOF && isdigit(c);c=getch())
            tmp=10 * tmp + (c-'0');
        printf("debug:%f\n", sign*tmp);
        *pn=*pn*powf(10.0f, sign*tmp);
    }
    if(c!=EOF)
        ungetch(c);
    return c;
}

可能还是有问题

于 2013-07-05T11:09:30.783 回答
0

for (*pn, ...)想要达到什么目的?这是循环的初始化阶段,但*pn只是获取pn指向的内容并将其丢弃。

于 2013-07-05T11:09:40.440 回答