【问题标题】:Error in copying argv to char array将 argv 复制到 char 数组时出错
【发布时间】:2014-12-27 11:47:12
【问题描述】:

我正在尝试将 argv 复制到 char 数组,在线解决了一些问题,但最终出现了 Segmentation Fault。以下是我使用的代码:

void main (int argc,const char *argv[])
{
    char *arr;
    arr = (char *) malloc(strlen(argv[1])+1);
    strcpy(arr,argv[1]);
}

请帮助确定我做错了什么。

【问题讨论】:

  • 你在运行程序时指定了哪个参数?您应该在分配、复制之前检查argc > 1
  • argv[1] 是什么? strlen(NULL) 会导致 UB 和 segfault。见this
  • 你至少给程序传递了一个参数?请告诉我们您如何调用该程序以及您传递给它的参数。
  • 谢谢你..它现在工作正常..

标签: c++ c


【解决方案1】:

似乎 argv[1] 等于 NULL 甚至不存在(C 标准允许 argc 可能等于 0)。

添加以下检查

char *arr;

if ( argc > 1 )
{
    arr = (char *) malloc(strlen(argv[1])+1);
    strcpy(arr,argv[1]);
}
else
{
    // print some error message
}

【讨论】:

  • @Sourav Ghosh 我不明白你为什么不赞成我的回答。
  • 我刚刚添加了更多信息。见我之前的评论。不是和urs一样吗?那我为什么要投反对票?
  • @Sourav Ghosh 我不知道,但我的回答被否决了。所以知道为什么它被否决是很有趣的。
  • 同上。我还希望有评论说明反对票的原因。
【解决方案2】:

请帮助确定我做错了什么。

好的,先生。您要求 argv[1],但您不确定它是否存在。访问超出其边界的数组具有未定义的行为。您应该始终检查参数的数量是否是您希望避免未定义行为的:

if ( argc < 2 )
{
    // error, cannot copy argv[1] because it doesn't exist. Explain this to user
}

// now OK..., also we postponed allocation of arr pointer 
char *arr =  malloc( strlen( argv[1]) + 1);
        //^^^^
        // no need to cast return value of malloc in C

strcpy( arr, argv[1]);

【讨论】:

    【解决方案3】:

    当使用命令行输入时,我们应该处理参数的数量。

    你可以试试这样的..

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    void main (int argc, const char *argv[])
    {
     if(argc==2)//change condition based on your requirements
     {
      char *arr;
      arr = (char *) malloc(strlen(argv[1])+1);
      strcpy(arr,argv[1]);
      printf("string is %s\n",arr);
     }
    else
     {
     printf("check your command line input (only 2 parameters)\n");
     }
    }
    

    输出:

     $ ./a.out 
     check your command line input (only 2 parameters)
     $ ./a.out hello
     string is  hello
     $ ./a.out hi hello
     check your command line input (only 2 parameters)
     $ 
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多