我正在自己练习 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;
}