2017-09-02 41 views
2

這是我在C中的第一個程序。當我運行這個斜邊它發現是巨大的。我輸入A和B作爲2,輸出是130899047838401965660347085857614698509581032940206478883553280.000000。我做錯了什麼?C程序找到斜邊,斜邊發現太大

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int die(const char *msg); 
double hypotenuse(double side0, double side1); 

int main() 
{ 
    double a, b, c; 
    printf("Enter side A: "); 
    if (scanf_s("%1f", &a) != 1) 
     die("input failure"); 
    printf("Enter side B: "); 
    if (scanf_s("%1f", &b) != 1) 
     die("input failure"); 
    c = hypotenuse(a, b); 
    printf("The hypotenuse is %f\n ", c); 
} 

int die(const char *msg) 
{ 
    printf("Fatal Error: %s\n", msg); 
    exit(1); 
} 

double hypotenuse(double side0, double side1) 
{ 
    return sqrt((side0 * side0) + (side1 * side1)); 
} 
+0

啓用編譯器警告。 – tkausl

+5

'「%1f」' - >''%lf「' – BLUEPIXY

+0

看起來您的'scanf_s()'字段指令不正確。與'double'指針相對應的指令應該是'%lf'(帶小寫字母的ell),但是您已經使用了'%1f'(帶有數字1)。 –

回答

5

。在你的scanf()轉換說明一個錯字:%1f應該是%lf與ELL,而不是一個。

這兩個字符看起來似乎很相似。出於這個原因,它也建議,以避免變量命名llll1

指定器%1f嘗試至多1個字節從流轉換爲一個浮點數和存儲結果到float其地址已通過。你傳遞一個double的地址,所以行爲是不確定的。 可以通過增加的警戒線防止這種愚蠢的錯誤的:

  • gcc -Wall -Wextra -Werror
  • clang -Weverything -Werror
  • cl /W3cl /W4cl /Wall
+1

'cl/Wall'也很好地工作。 (儘管編譯器警告與'gcc'提供的警告相比顯得蒼白......) –