2013-06-11 51 views
1

我被賦予了創建一個掃描浮點的過程,稱爲getfloat。掃描一個浮點數,得到看似隨機的值

由於某種原因,我得到了隨機值。如果我輸入「1」,它會打印49.爲什麼會發生這種情況?而且,當我輸入值時,我無法在屏幕上看到它們?當我使用scanf例如我看到我在黑色小屏幕上點擊了。但現在屏幕只是空白,當我點擊輸入它顯示一個不好的輸出:

示例 - 輸入:-1。輸出:499.00000 這裏是我的代碼:

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <ctype.h> 
void getfloat(float* num); 
void main() 
{ 
    float num=0; 
    printf("Enter the float\n"); 
    getfloat(&num); 
    printf("\nThe number is %lf\n",num); 
    getch(); 
} 
void getfloat(float* num) 
{ 
    float c,sign=1,exponent=10; 
    c=getch(); 
    if((!isdigit(c))&&(c!='+')&&(c!='-')) //if it doesnt start with a number a + or a -, its not a valid input 
    { 
     printf("Not a number\n"); 
     return; 
    } 
    if(c=='-') //if it starts with a minus, make sign negative one, later multiply our number by sign 
     sign=-1; 
    for(*num=0;isdigit(c);c=getch()) 
     *num=(*num*10)+c; //scan the whole part of the number 
    if(c!='.') //if after scanning whole part, c isnt a dot, we finished 
     return; 
    do //if it is a dot, scan fraction part 
    { 
     c=getch(); 
     if(isdigit(c)) 
     { 
      *num+=c/exponent; 
      exponent*=10; 
     } 
    }while(isdigit(c)); 
    *num*=sign; 
} 

回答

1

有很多問題。

1)您發佈的代碼與您的示例「輸入:-1。輸出:499.00000」不匹配,因爲找到'-'後缺少getch(),我得到0。見#6。

1)'c'是一個字符。當您輸入'1'時,c代表字母1(在您的情況爲ASCII編碼)爲49.要將數字從其ASCII值轉換爲數字值,請減去48(字母'0'的ASCII代碼,經常做的c - '0'

*num=(*num*10)+c; 
*num+=c/exponent; 

成爲

*num = (*num*10) + (c-'0'); 
*num += (c-'0')/exponent; 

2)儘管聲明c作爲float,建議您聲明它作爲一個intint是從getch()返回的類型。

3)功能getch()是「用於從控制檯獲取角色但不回顯到屏幕」。這就是爲什麼你不看他們。改爲考慮getchar()

4)[編輯:刪除避免=-。謝謝你@Daniel Fischer]

5)你的指數計算需要返工。注意:您的指數可能會收到符號字符。

6)當您測試if(c=='-')時,您不會再獲取另一個c。您也可能想要測試else if(c=='+')並使用該c

祝你好運在你的C之旅。

+0

複合賦值運算符的'= -'等形式在第一個標準被批准之前已經被廢除。 'sign = -1;'在過去(至少)30年中編寫的所有C編譯器中都是明確的'sign = -1;'(只有更少的可讀性)。 [「在B和C早期,操作員拼寫= +而不是+ =;這個錯誤在1976年修復,...」](http://cm.bell-labs.com/cm/cs/who/ DMR/chist。html)迂腐的筆記:「c採用字母的ASCII代碼」不一定是真的,它也可能是EBCDIC(或者不同的編碼,但是與ASCII兼容,EBCDIC是我知道使用的唯一的)。 –

+0

@Daniel Fischer我很少看到一個非間距的'= - ',我和你一樣,確信它已經過時。我對代碼的測試_儘管做了' - ='函數。我會稍後再回顧一下。一般來說,關於「c採用ASCII ...不必是真的」,但OP的「如果我輸入」1「它打印49」肯定指向ASCII。順便說一句,在ASCII或EBCDIC中,(c - '0')將'c'轉換爲其數值。 – chux

+0

當我在'sign = -1;'後面打印'sign'時,我的代碼調試出錯了(我假設它是一個'int'類型與'float'類似的類型,看到一個'0' (儘管已經過時)'C'語法。mea culpa) – chux

0

小提示:49是爲character 1. ASCII您正在使用的getch(),它給你返回值char

1

49是編號爲1的Ascii代碼。所以當(0'<=c && c <='9')時,您需要扣除'0'以獲取編號本身。