if&中的意外输出用C代码切换语句

时间:2014-11-21 05:56:53

标签: c

我无法弄清楚为什么以下代码中的任何一个无法按预期运行。 两者都编译成执行文件。

输出:

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");
}

使用开关:

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 个答案:

答案 0 :(得分:7)

main不接受来自命令行的输入作为直接参数,如果没有参数,那么你得到的参数计数为12如果有一个参数,则会导致奇怪的行为。

main应定义为int main( int argc, char *argv[] )或类似内容。要获取输入,您需要首先通过测试argc(参数计数,加上可执行路径的一个)来检查它是否存在,然后将argv[1]转换为整数。 atoi可用于将字符串转换为整数。

答案 1 :(得分:2)

请注意,main的第一个参数是argc,即命令行中给出的应用名称+参数总数。 main上有第二个参数,char *argv[]用于接收命令行参数。

您获得所述行为的原因是您的参数in取代了argc的目的。即,当你执行没有命令行参数的应用程序时,argc计数为1,有一个参数,它将是2,等等 - 这是传递给in的值。由于命令行参数(main)没有第二个argv参数,因此根本不会收到实际参数。

要解决此问题,您需要为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