2015-07-05 161 views
0

我在寫第一個C程序。我試圖修改Ritchie和Kernighan關於Farhenheith和Celsius轉換的早期教程,但是我收到了我無法解決的錯誤。C編譯器錯誤

我的目標是運行./a.out fahr 20,腳本打印出Farhenheit溫度從20開始(從300開始)到攝氏溫度的轉換。

但如果我寫./a.out celsius 0腳本將打印出攝氏溫度的轉換從0開始(和去300)到華氏溫度。

這是當前的腳本(下面是從編譯器中得到的錯誤)。

我認爲有很多錯誤,但我只是開始學習和感謝任何幫助。

#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv){ 

    float fahr, celsius; 
    int upper, step; 

    upper = 300; 
    step = 20; 


    if (strcmp("fahr", argv[1] == 0)){ 
     fahr = argv[2]; 
     while (fahr <= upper){ 
      fahr_conversion(fahr); 
      fahr = fahr + step; 
     } 
    } 
    else if (strcmp("celsius", argv[1] == 0)){ 
     celsius = argv[2]; 
     while (celsius <= upper){ 
      cels_conversion(celsius); 
      celsius = celsius + step; 
     } 
    } 
} 

int fahr_conversion(float fahr){ 
     float celsius; 
     celsius = (5.0/9.0) * (fahr - 32.0); 
     printf("%3.0f -> %6.1f\n", fahr, celsius); 

} 
int cels_conversion(float celsius){ 
     float fahr; 
     fahr = (celsius + (9.0/5.0)) + 32.0; 
     printf("%3.0f -> %6.1f\n", celsius, fahr); 
} 

錯誤:

Far-Cels-Converter $ cc main.c 
main.c:16:21: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     if (strcmp("fahr", argv[1] == 0)){ 
          ^~~~~~~~~~~~ 
/usr/include/string.h:77:39: note: passing argument to parameter here 
int  strcmp(const char *, const char *); 
             ^
main.c:17:8: error: assigning to 'float' from incompatible type 'char *' 
       fahr = argv[2]; 
        ^~~~~~~~ 
main.c:19:4: warning: implicit declaration of function 'fahr_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         fahr_conversion(fahr); 
         ^
main.c:23:29: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     else if (strcmp("celsius", argv[1] == 0)){ 
            ^~~~~~~~~~~~ 
/usr/include/string.h:77:39: note: passing argument to parameter here 
int  strcmp(const char *, const char *); 
             ^
main.c:24:11: error: assigning to 'float' from incompatible type 'char *' 
       celsius = argv[2]; 
         ^~~~~~~~ 
main.c:26:4: warning: implicit declaration of function 'cels_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         cels_conversion(celsius); 
         ^
main.c:32:5: error: conflicting types for 'fahr_conversion' 
int fahr_conversion(float fahr){ 
    ^
main.c:19:4: note: previous implicit declaration is here 
         fahr_conversion(fahr); 
         ^
main.c:38:5: error: conflicting types for 'cels_conversion' 
int cels_conversion(float celsius){ 
    ^
main.c:26:4: note: previous implicit declaration is here 
         cels_conversion(celsius); 
         ^
4 warnings and 4 errors generated. 

回答

3

這裏有一些各種錯誤。

main.c:16:21: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     if (strcmp("fahr", argv[1] == 0)){ 
          ^~~~~~~~~~~~ 

括號只是錯誤的。它應該是if (strcmp("fahr", argv[1]) == 0)。

main.c:17:8: error: assigning to 'float' from incompatible type 'char *' 
       fahr = argv[2]; 
        ^~~~~~~~ 

你不能指定一個字符串到一個浮點數,你必須使用一些函數來轉換它。例如。 fahr = strtof(argv[2], 0)。您需要爲strtof包含標頭<stdlib.h>

main.c:19:4: warning: implicit declaration of function 'fahr_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         fahr_conversion(fahr); 
         ^

main使用fahr_conversion之前fahr_conversion出現在源,編譯器還不知道的fahr_conversion類型的,所以假設標準型(幾乎總是是不是你想要的)。這是由主前添加一個函數原型解決:

int fahr_conversion(float fahr); 

雖然,我不知道int是不是真的是你想要的返回類型。如果你沒有返回任何東西,返回類型應該是void

+0

偉大我認爲我幾乎在那裏:但是我收到了此警告:'main.c:21:10:warning:隱式聲明函數'strtof'在 無效C99 [-Wimplicit-function-declaration] fahr = strtof(argv [2],0);' – Jeff

+0

作品。 Horray! – Jeff

+0

沒錯,你需要''strtof'的''頭文件。 – nemetroid

4

讓它if (strcmp("fahr", argv[1]) == 0)
右括號的位置是錯誤的,因此錯誤
同樣,改變else if條件來
(strcmp("celsius", argv[1]) == 0)
此外,你的變量fahr是浮動,因爲你將它分配給argv [2],它是char *類型的,因此你得到一個錯誤。
所以你需要將char *轉換爲float或double。 atof函數將幫助你在這裏。試試這個
fahr=atof(argv[2]);
確保你包含stdlib頭文件。

+0

謝謝,這修正了幾個錯誤的列表。 :) – Jeff

+0

很高興我可以幫助:)如果這解決了您的問題,請接受它作爲答案。 –

+0

嗯,我仍然得到這個錯誤:'main.c:17:8:錯誤:從不兼容類型char *' fahr = argv [2];'和這一個:'main。 c:32:5:錯誤:'fahr_conversion'的衝突類型 int fahr_conversion(float fahr){' – Jeff

2

首先,您要測試第一個參數是否爲「fahr」字符串。所以,你應該做的:
比較字符串:

strcmp("fahr", argv[1]) 

測試對比結果

strcmp("fahr", argv[1]) == 0 

和執行取決於試驗結果

if(strcmp("fahr", argv[1]) == 0) {.....} 

找出差異代碼行動!

其次,您想要將第二個參數作爲數值。唉,它是一個字符串!將字符串分配給float變量將無法得到適當的結果。你需要一些strig-float轉換函數。關於可能性是atof()

fahr = atof(argv[2]); 
+0

很好,幾乎在那裏,但我得到:'main.c:29:10:警告:函數'atof'的隱式聲明在C99中是無效的[-Wimplicit-function-declaration] fahr = atof(argv [2 ]);'當使用atof()' – Jeff

+0

@Jeff該函數屬於一個標準的C庫,你可以通過在你的代碼的開頭添加'#include '來包含函數聲明(最好在第一行,在任何其他聲明之前)。 – CiaPan