【问题标题】:Segmentation fault when reading the arguments in the main function读取主函数中的参数时出现分段错误
【发布时间】:2018-08-19 13:37:01
【问题描述】:

用户应该在运行程序时传递一些参数,这些参数必须具有以下结构: hanoiplus -d -f -o 他们可以以不同的顺序编写它们,甚至不必全部编写。例如: hanoiplus -f 你好 -d 3 但它只有在开头有 hanoiplus 这个词才有效。 这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define HPLUS "hanoiplus"
#define DCMD "-d"
#define FCMD "-f"
#define OCMD "-o"

int main(int narg, char**cmd) {

if(strstr(HPLUS,cmd[1])){

for(int i=2; i <= narg; i++){

    if(strstr(DCMD,cmd[i]) && i<narg){ /*EXECUTE -d COMMAND IF SPECIFIED*/

        i++; //Increase i by 1 to go to the next command           
        printf("INPUT: %s %s",cmd[i-1],cmd[i]); //Change the number of disks to cmd[i]

    }else if(strstr(FCMD,cmd[i]) && i<narg){ /*EXECUTE -f COMMAND IF SPECIFIED*/

        i++;         
        printf("INPUT: %s %s",cmd[i-1],cmd[i]);
        create_file(cmd[i]);//Call the function that creates an external file

    }else if(strstr(OCMD,cmd[i]) && i<narg){ /*EXECUTE -o COMMAND IF SPECIFIED*/

        i++;         
        printf("INPUT: %s %s",cmd[i-1],cmd[i]);
        create_object(cmd[i]);//Call the function that calls the writing operation

    }
}
return 1; //The command(s) is/are valid.
}else{
return 0; //The command is not valid.
}
} 

所有命令都保存为 char **cmd 的元素。 首先,程序检查第二个命令是否为“hanoiplus”——因为第一个命令始终是我不感兴趣的路径——然后它执行一个 for 循环,该循环遍历 **cmd 与元素一样多次**cmd 有。 在每次迭代中,程序都会检查输入了什么命令,并调用执行命令所代表内容的函数。 该程序还会打印输入,因此我可以检查参数是否正确传递。

虽然循环的第一次迭代运行良好,但第二次程序崩溃并显示分段错误。

有人知道发生了什么吗?

谢谢。

【问题讨论】:

  • 不是您的段错误的原因,而是:您使用strstr 没有任何意义。您想检查参数字符串是否相等。使用if(strcmp(DCMD, cmd[i] == 0)之类的东西。
  • 不是您的段错误的原因,而是:如果您使用标准名称作为 @ 987654324@。请将narg 替换为argc,将cmd 替换为argv。
  • 您的段错误的原因可能是您正在运行超过参数数组的末尾。 C 中的数组是从 0 开始的。您对参数的循环应该从 1 开始并在计数之前结束:for(int i=1; i &lt; narg; i++)。当您确保选项标志 和 以下参数有空间时,您需要 +1 或 -1:if(strcmp(DCMD,cmd[i]) == 0 &amp;&amp; i+1&lt;narg).
  • 不是你的段错误的原因,而是:坚持“第一个词”是“hanoiplus”是愚蠢的、不必要的,而且可能是错误的。但如果你真的想检查,你会比较argv[0],而不是argv[1]。
  • 好的,我修好了。问题是我必须写 i

标签: c command argv


【解决方案1】:

这些表达式会导致您的程序访问不存在的参数cmd[narg]。

if(strstr(DCMD,cmd[i]) && i<narg)

所以,strstr 可能会因此而崩溃。您需要交换表达式中的术语以避免该问题:

if(i < narg && strstr(DCMD,cmd[i]))

或在循环中使用i &lt; narg。

【讨论】:

  • 他有i&lt;narg 不是为了(试图)保护strstr 不崩溃,而是防止下面的printf 崩溃。应该从崩溃中 printf strstr 是 (i=2; i &lt;= narg; i++) 循环,但这也是错误的。
  • @SteveSummit 是的,但这是 OP 的错误,会导致崩溃。交换条款将防止崩溃。
  • OP 有很多个错误。交换表达式中的术语是一种创可贴,并不能真正解决任何问题。正如您最后建议的那样,将循环表达式更改为i &lt; narg 会更好,但是如果您处于参数的最后,会发生什么情况,您在其中一个条件成功后执行i++,并调用@987654333 @?
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多