【问题标题】:What is wrong with this setup?这个设置有什么问题?
【发布时间】:2009-05-05 02:54:32
【问题描述】:

我创建了一个名为 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 进行测试运行 add,并让 add 返回这些值的总和 (12),然后 test 会将其显示到屏幕上。我是如何得到 6841420 的,我该如何解决?

【问题讨论】:

  • 您可能还需要在程序中进行一些错误检查,以确保实际上已将 2 个参数传递给您的程序。像... if(argc == 3) ... 一开始就可以了。

标签: c++ parameters


【解决方案1】:

问题是您将指针值转换为整数。参数将作为 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 个参数传递给程序。

【讨论】:

  • 当我使用 atoi(argv[1]) 我得到“错误 C2664: 'atoi' : cannot convert parameter 1 from 'char **' to 'const char *”
  • @Keand64,再试一次样品。您的原始示例在主要方法上的签名错误(*`s 太多),我没有检查就复制了它。
【解决方案2】:

您的 add.exe 正在将指向字符串的指针转换为无符号整数,因此它将它们在内存中的位置而不是数字相加。

使用 sscanf (或者,如另一个答案中所建议的, atoi - 它可能更容易)。

【讨论】:

    【解决方案3】:

    这可能是一个玩具,但作为一个仅供参考,你不能指望能够从 main() 返回整个整数范围。首先,system() 使用各种值作为标记(例如 -1 和 127),因此您无法区分执行失败和其中一个值的合法结果之间的区别。其次,shell 可能会将返回值的范围限制为仅 8 位(使用剩余的位来获取额外的状态信息)。

    【讨论】:

      【解决方案4】:

      关于使用 atoi() 或 sscanf() 将 argv[] 元素从字符串转换为实际整数的答案是正确的。

      但是,您的测试用例还有另一个问题。 system() 的返回值是运行的进程的退出状态,它与平台无关。然而,在大多数平台上,事情是这样安排的,0 的值意味着命令运行正常,并最终调用了exit(0) 本身。 Windows 符合这一要求。

      cout&lt;&lt;system(...) 行正在打印该状态值。在许多平台(尤其是 POSIX 兼容的平台)中,如果进程在没有异常终止的情况下运行,则状态代码的低字节将为零,而高字节将是传递给 exit() 的值,假设值为 255 或更少。

      实际上,使用退出状态向父进程传达比成功/失败更多的信息是高度依赖于平台的,并且有更好的方法来做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多