这个设置有什么问题?

时间:2009-05-05 02:54:32

标签: c++ parameters

我创建了一个名为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的,我该如何解决?

4 个答案:

答案 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或更小。

实际上使用退出状态来传递更多信息而不仅仅是父进程的成功/失败是高度依赖平台的,并且有更好的方法来实现它。