这是我的代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{
int a;
for(int i=1;i<=argc;i++){
a+=atoi(argv[i]);
}
printf ("%d",a);
}
我不断遇到分段错误,但我正在尝试将命令行的所有元素相加,例如/a.out 5 6 7将给出18作为输出,欢呼。
(崩溃)的问题在于循环本身:
for(int i=1;i<=argc;i++)
argc
自变量是传递给程序的自变量的数目;程序名称";在CCD_ 2处。所以实际参数的有效索引是argv[1]
到argv[argc - 1]
。
此外,argv
数组由一个空指针终止,该指针将位于argv[argc]
。
由于您在循环中包含argv[argc]
,因此您将向atoi
传递一个空指针,这将导致未定义的行为并可能导致崩溃。
简单的解决方案是使用小于<
而不是小于或等于作为循环条件:
for(int i=1;i<argc;i++)
您从未将a
初始化为0
。另外,使用strtol()
函数。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int a = 0;
for (int i = 1; i < argc; i++) {
a += strtol(argv[i], NULL, 10);
}
printf("%dn", a);
return EXIT_SUCCESS;
}