【发布时间】:2016-10-18 04:13:51
【问题描述】:
这是一个函数的一部分,它从终端获取输入并根据输入的内容对它们进行排序(排序类型、要使用的排序方法的版本/变体以及数组的大小)。这是我目前所拥有的:
int main(int argc, char * argv[]) { //will have 3 arguments not including function name: sortingtype, version and arr size
int * arr = make_arr(argv[2], argv[3]); //[2]
if (strcmp(argv[1], "sortingtype1") == 0) {
SortingType1(arr, argv[3]); //[2][3]
}
else if (strcmp(argv[1], "sortingtype2") == 0) {
SortingType2(arr, argv[3]); //[2][3]
}
else {
return 0;
}
}
void test(){ //[1]
main("sortingtype1", "a", 10); //sortingtype, version and arr size
}
[1] 我有一个函数 test() 来模拟来自终端的输入,但我不知道它是否可以这样工作。我收到一条错误消息,提示 main 参数太多。
[2] 无论我是否删除该测试函数,我仍然会收到有关“传递参数 (带有 argv[X] 的参数) 从指针中生成整数而不进行强制转换”的警告。
[3] 这些也需要是int类型而不是char*类型,如何更改?
关于如何解决这个问题有什么建议吗?我已经看到了使用 sscanf 的解决方案,但我希望首先了解一个围绕我的技能水平的更基本的解决方案。
编辑:分段错误来自
int * SortingType2(int * arr, int len) {
for (int i=1; i < len; i++) {
int x = arr[i];
int j = i;
while ((j > 0) && (x < arr[j-1])) {
arr[j] = arr[j-1];
j--;
}
arr[j] = x;
}
return arr;
}
int main(int argc, char * argv[]) {
int size;
if (argc > 3) size = atoi(argv[3]);
int * arr = make_arr(argv[2][0], size);
if (strcmp(argv[1], "sortingtype1") == 0) {
SortingType1(arr, size);
}
else if (strcmp(argv[1], "sortingtype2") == 0) {
SortingType2(arr, size);
}
else {
return 0;
}
}
【问题讨论】:
-
您不应该直接致电
main。这是在任何教程或教科书的第一课中教授的基本 C。请咨询这些。 -
sscanf是将字符串转换为int的不错选择。其他选项是strtol和atoi。strtol在处理错误检查的方式上有点迟钝。atoi根本不会打扰。sscanf是中间地带,具有易于使用的良好错误检查功能。 -
@kaylum——一个小问题。 C 标准当然允许递归调用
main()。 -
@kaylum:你对 C++ 和 C 感到困惑吗?在 C++ 中,不允许调用
main()(详见What shouldmain()return in C and C++)。在C语言中,没有禁止调用main()——它是一个普通的函数,可以被用户代码调用,唯一特别的是在托管环境中,它是启动代码调用的函数. -
@JonathanLeffler 我知道有人会指出这一点 :-) 我只是懒得深入细节。我的意思是说没有必要像那样显式调用
main,并且无论如何都不会调用test函数。
标签: c segmentation-fault arguments