我创建了一个名为test的程序:
#include<stdlib.h>
#include<iostream>
int main()
{
std::cout<<system("..\\add\\debug\\add.exe 4 8");
while(true);
return 0;
}
add.exe由
组成#include<stdlib.h>
int main(int argc,char **argv[])
{
int n=((unsigned)argv[1]);
int m=((unsigned)argv[2]);
return(n+m);
}
所以当我进行测试时,我得到了
6841420
尝试使用参数4和8进行测试运行添加,并且要添加以返回这些值的总和(12),然后测试将显示到屏幕。我是如何得到6841420的,我该如何解决?
答案 0 :(得分:8)
问题是您正在将指针值转换为整数。参数将作为C样式字符串(const char*
)传递给您的程序。您需要首先使用像atoi这样的API将它们转换为字符串。
#include<stdlib.h>
int main(int argc,char *argv[])
{
int n= atoi(argv[1]);
int m= atoi(argv[2]);
return(n+m);
}
修改强>
正如其他人指出的那样,您还应该进行一些错误检查,以确保实际上有2个参数传递给程序。
答案 1 :(得分:0)
你的add.exe正在将指向字符串的指针转换为无符号整数,因此它在内存中添加它们的位置而不是数字。
使用sscanf(或者,正如另一个答案所建议的那样,atoi - 它可能更容易)。
答案 2 :(得分:0)
这可能是一个玩具,但作为一个FYI,你不能指望能够从main()返回整个范围的整数。首先,system()使用各种值作为标记(例如,-1和127),因此您无法区分失败的执行与其中一个值的合法结果之间的区别。其次,shell可能会将返回值的范围限制为仅仅8位(使用其余位来获取其他状态信息)。
答案 3 :(得分:0)
使用atoi()或sscanf()将argv []元素从字符串转换为实际整数的答案恰到好处。
但是,您的测试用例还有另一个问题。 system()
的返回值是运行的进程的退出状态,这不仅仅是一个平台依赖。但是,在大多数平台上,事情的排列方式使得值0
表示命令运行正常,最终调用exit(0)
本身。 Windows符合这一点。
行cout<<system(...)
正在打印该状态值。在许多平台(特别是POSIX兼容的平台)中,如果进程在没有异常终止的情况下运行,则状态代码的低字节将为零,而高字节将是传递给exit()
的值,假设该值为255或更小。
实际上使用退出状态来传递更多信息而不仅仅是父进程的成功/失败是高度依赖平台的,并且有更好的方法来实现它。