我编写了一个代码,用于汇总从命令行引入的整数:
#include <stdio.h>
int main(int argc, int* argv[]) {
int i, s=0;
for (i=1;i<argc;i++)
s=s + *argv[i];
printf("Sum: %d\n", s);
return 0;
}
最好的部分是,它通过了gcc编译过程,但是当我实际运行它并插入数字时,结果似乎我以某种方式突破了int
的范围。
答案 0 :(得分:2)
您似乎正在以C89模式编译代码,其中 s
默认为编译器int
。 s
未初始化,因此无法预料到任何好处。如果它将调用未定义的行为。
请注意,argv[i]
属于char *
类型(更改您的main
签名),您需要先将其转换为int
,然后再将其添加到s
。
答案 1 :(得分:0)
假设您已正确初始化s
,如下所示。
除此之外,main()
的原型应如下所示,以获取命令行参数。
int main(int argc, char **argv)
{
int s =0;
// Check for argc matches the required number of arguments */
for(i=1;i<argc;i++)
s=s + atoi(argv[i]); /* Use atoi() to convert your string to integer strtol() can also be used */
printf("%d\n",s);
return 0;
}
PS:使用未初始化的变量导致未定义的behvaior
答案 2 :(得分:0)
main
的2 nd 参数应该是char**
类型或char*[]
类型而不是int*[]
。因此,*argv[i]
的类型为char
。您可以获取每个字符串argv[i]
,而不是获取每个字符,然后从中提取数字并将其分配给变量,例如char*
。这可以通过使用num
函数来完成:
sscanf