我想在命令行中提供几个参数,例如:
./programName -a 103 -p argument1,argument2,argument3
然后,我想用这些参数的值创建几个变量:一个整数变量用于紧跟在标志-a
之后的数字,一个整数变量用于紧跟在标志-p
之后的参数数量和一个包含所有这些参数的数组变量。
它总是相同的参数(因此我的代码无法管理其他形式的输入): - a(整数)-p(用,分隔的参数列表)
我的问题是存在分段错误。在多次尝试查看它发生的位置(使用多个printf
)之后,当变量a = 3时(因此在标志-p处)存在分段错误。分段发生在" case''""。
我不明白为什么这段代码接受了#34; -a"但不是" -p"。我并不认为因为我的代码在"案例''""因为分段错误发生在那之后(在第34行' p''")。
我希望您能理解我的问题并感谢您的帮助:)。
编辑:
感谢Mark Wilkins和ooga的回答。分段错误确实是由于阵列的各个元素没有被初始化。 如果有些人不知道如何有效地初始化一系列字符串,请查看另一个问题,它已得到很好的解释;):
答案 0 :(得分:1)
导致分段错误的一个问题是使用arg_p
。它被声明为char*
的数组,但数组的各个元素永远不会被初始化。随后使用它将导致访问未初始化的指针:
*(arg_p[b]+c) = *(chrp+c);
答案 1 :(得分:1)
在组装参数数组时发生了段错误。试试这个:
arg_p[0] = chrp;
chrp2 = strchr(argv[a+1], ',');
int b = 1;
while (chrp2 != NULL) {
*chrp2 = '\0';
arg_p[b++] = chrp2 + 1;
chrp2 = strchr(chrp2 + 1, ',');
}
另请注意,您的arg_p
数组在本地声明为该块,并且在该块之后将不再存在。您可能希望声明一个char** arg_p
指针并对该空间进行malloc。记得最后释放它。
答案 2 :(得分:0)
当你增加' a'到2,你将离开argv数组的末尾。您只想增加1,因为它将命令行中的单词(用空格分隔)索引而不是字符。