2014-11-21 69 views
2

我無法弄清楚爲什麼下面的代碼無法按預期方式運行。 兩者都編譯成執行文件。在C代碼中的if&switch語句中的意外輸出

輸出:

a.out , prints 1, expected "no value" 
a.out 1, prints 2, expected 1 
a.out 2, prints 2, expected 2 

使用情況:

void main(int in) 
{ 
int a = in ; 
printf("In function if\n"); 
if (in == 1) 
    printf("1\n"); 
else 
    if (in == 2) 
    printf("2\n"); 
    else 
    printf("wrong value\n"); 
} 

使用switch:

void main(int in) 
{ 
    switch(in) 
    { 
    case 1: printf("1\n");     break; 
    case 2: printf("2\n");     break; 
    default: printf("wrong value\n"); break; 
    } 
}; 

我試圖讓C代碼以下LISP功能:

(cond ((= in 1) 1) 
     ((= in 2) 2) 
     (t  nil)) 

感謝您的協助。

+2

'無效的主要(int類型)'在C.我不知道是非法的不瞭解Lisp,你想達到什麼目的?具體來說,你期望'in'來自命令行參數還是標準輸入? – 2014-11-21 05:57:26

+0

我試圖讓case語句像預期的那樣行爲。 – Dan 2014-11-21 06:04:08

+0

我似乎從案例和if語句中得到了錯誤的答案。我在代碼中用int替換了void,並且沒有改變。我不希望返回值只是爲了輸出正確的行。這只是測試代碼,看看我能否得到它的工作 – Dan 2014-11-21 06:12:30

回答

7

main不接受命令行直接變量的輸入,你所得到的參數計算在那裏是1如果沒有參數,2如果有一個說法,這會導致奇怪的行爲。

main應該定義爲int main(int argc, char *argv[])或類似的東西。要獲得輸入,需要通過測試argc(參數計數,加上一個可執行文件路徑),然後將argv[1]轉換爲整數來檢查它是否存在。 atoi可用於將字符串轉換爲整數。

2

請注意,main的第一個參數是argc,這是應用程序名稱+參數在命令行中給出的總計數。在main,char *argv[]上有第二個參數用於接收命令行參數。

您所描述的行爲的原因是因爲您的參數in取代argc的目的。即當您執行沒有命令行參數的應用程序時,argc計數爲1,其中一個參數爲2,等等 - 這是傳遞給in的值。由於命令行參數(argv)沒有第二個main參數,因此根本不會收到實際參數。

要解決這個問題,你需要解析第二args陣列爲您in整數參數:

#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    if (argc < 2) 
     return EXIT_FAILURE; // ... print out the correct command line usage to user 

    char *endPointer = NULL; 
    long in; 

    in = strtol(argv[1], &endPointer, 10); 

    if (endPointer != NULL) { 
     switch(in) { 
     case 1: 
      // ... same code as above 
     } 
     return EXIT_SUCCESS; 
    } 
    return EXIT_FAILURE; // User hasn't provided a number for 1st param 
} 

Ide One Sample Here