2014-11-21 97 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