【发布时间】: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 < narg; i++)。当您确保选项标志 和 以下参数有空间时,您需要 +1 或 -1:if(strcmp(DCMD,cmd[i]) == 0 && i+1<narg). -
不是你的段错误的原因,而是:坚持“第一个词”是“hanoiplus”是愚蠢的、不必要的,而且可能是错误的。但如果你真的想检查,你会比较
argv[0],而不是argv[1]。 -
好的,我修好了。问题是我必须写 i