【问题标题】:Unexpected output in if & switch statements in C codeC 代码中的 if 和 switch 语句中的意外输出
【发布时间】:2015-01-19 05:22:13
【问题描述】:

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

输出:

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))

感谢您的帮助。

【问题讨论】:

  • void main(int in) 在 C 语言中是非法的。我不了解 Lisp,你想达到什么目的?具体来说,您希望in 来自命令行参数或标准输入?
  • 我正在尝试让 case 语句按预期运行。
  • 我似乎从一个案例和一个 if 语句中得到了错误的答案。我在我的代码中用 int 替换了 void 并且没有任何变化。我不期望返回值只是为了打印功能输入的正确行。这只是测试代码,看看我是否可以让它工作

标签: c


【解决方案1】:

main 不接受来自命令行的输入作为直接参数,如果没有参数,您将在其中获取参数计数 1,如果有一个参数,则为 2,这导致奇怪的行为。

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

【讨论】:

    【解决方案2】:

    注意main的第一个参数是argc,是应用名+命令行给定参数的总数。 mainchar *argv[] 上还有第二个参数用于接收命令行参数。

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

    要解决此问题,您需要为您的 in 整数参数解析第二个 args 数组:

    #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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2016-11-14
      相关资源
      最近更新 更多