【问题标题】:C command line argument checkC 命令行参数检查
【发布时间】:2015-07-30 02:06:40
【问题描述】:

我有以下代码部分,我注意到如果我将 0 更改为 1,结果是相同的。我得到STACKprint();,第二个参数是“on”,没有任何其他参数,如果没有参数,我会遇到分段错误。我想对于分段错误,我需要检查参数是否为NULL,但我不确定如何使用第二个参数来执行此操作,这真的让我很困惑为什么(strcmp (argv[2],"on") == 1) 没有效果。它不应该采用 TRUE 值吗?

 if (strcmp (argv[2],"on") == 0) {
            STACKprint();
            printf("\n");
 }

【问题讨论】:

  • 为了防止分段错误,需要检查argc
  • 您将使用argc(计数)来确定argv[2] 是否存在。
  • @aschepler 很抱歉这个愚蠢的问题,但STACKprint() 是什么?
  • 将 0 更改为 1 应该会改变结果。还有什么不对劲的。您能否编辑您的帖子以包含整个 main() 函数,将 1 放在适当的位置,并显示输出?

标签: c command-line-arguments


【解决方案1】:

为了避免segfault,检查argc的值来发现argv[2]是否存在。如果argc < 3,则未提供argv[2]

strcmp() 不返回真/假;它返回一个小于、等于或大于零的值,具体取决于其参数的相对值。

【讨论】:

    【解决方案2】:

    首先,要检查是否有参数,你应该使用main(int argc, char** argv)的argc变量,它表示你的argv数组的长度。

    if (argc < 3) {
      printf("missing argument\n");
      exit(-1);
    }
    

    至于strcmp,手册页仅声明如果参数中的两个字符串相等,则返回 0,否则返回非零……但不一定是 1。实际上它取决于实现。因此,使用它来检查字符串是否相等的方法是:

    if (0 == strcmp(argv[2], "on")) {
       // do something
    } else {
       // do something else
    }
    

    【讨论】:

    • 你的意思是argc&lt;3,因为他用的是argv[2],对吧?
    【解决方案3】:

    如果你的程序是这样的

    #include <stdio.h>
    
    
      int main (int argc, char**argv)
      {
         if (argc >= 3 && strcmp (argv[2],"on") == 1){
      //        STACKprint();
              printf("\n");
          }
      }
    

    并且你尝试使用myexe 1 on 运行它,它永远不会进入 if 块 如果你把 1 改成 0,它就会消失。

    还有其他问题。

    如果你能发布你的代码和你的调用方式,那就太好了。

    【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多