【问题标题】:I found a new paradigm: system我发现了一个新范式:系统
【发布时间】:2013-04-12 01:26:27
【问题描述】:

我目前正在学习如何处理命令行参数。我有一个程序需要调用另一个程序,都是用 C++ 编写的。我有一台 Windows 电脑。这是程序

#include "stdafx.h"
#include <iostream>
#include <sstream>

using namespace std;

void main()
{   
    char buffer[200];
    char arg1[6]="Hello";
    std::stringstream buffer;
    sprintf(buffer, "C:\system.exe %i %i", arg1);
    system(buffer);     

    system("pause");
}

我需要调用以下程序:

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

void main(int argc, char*argv[])
{       
    string baci;        
    for(int i = 1; i < argc; i++)
        baci += argv[i];

    if (baci=="Hello")
        cout << "Francesco, ti mando 4 baci !!!" << endl;   

    system("pause");
}

它没有正确创建命令行,我不知道为什么。任何人都可以帮助并解释为系统可执行文件使用双参数所需的任何变化吗?书籍和网络对这个过程不是很详细。我发现体面的只是这个,但我无法将它用于我的目的。 C++: How to use command line arguments

【问题讨论】:

  • 您能否编辑您的问题,以便更清楚您要问的具体问题是什么?
  • 我很想知道你是如何想出这个问题标题的......
  • 我不确定你想要什么。但是,如果您想要第二个参数,您似乎需要sprintf(buffer,"C:\system.exe %i %i %i",arg1,arg1,arg2) 之类的东西。
  • 这是一个新的system 范式如何?
  • @FrancescoPalazzetti:当你笑的时候,我们浪费了一些时间来尝试理解瓷砖和文本之间的错误。我们都是志愿者,没有报酬浪费我们的时间,所以请保持“礼貌”,让“政治”远离这里。没有人关心你是谁或来自哪里以及你有什么意见,在这里。使用和不一致的标题只是为了避免正确的答案,因为这是人们看到的第一件事,并且“调”起来。

标签: c++


【解决方案1】:

除了您的代码无法编译之外,还有一些明显的问题。首先,C++ 中没有 void main() 这样的东西。它必须返回int。第二个问题是您将buffer 重新声明为std::stringstream。第三个问题是您随后将其按值传递给 sprintf 的第一个参数,这将不起作用,因为它既不是 char* 也不是通过指针传递的。第四个问题是您试图将参数扩展为整数值 (%i) 而不是 C 样式字符串 (%s)。您还有两个参数格式说明符,但只传递一个。这样的结果是未定义的,第二个%i 可以扩展为任何值。

您的代码应该看起来像这样......

int main()
{   
    char buffer[200];
    char arg1[6]="Hello";
    sprintf(buffer, "C:\\system.exe %s", arg1);
    system(buffer);     

    system("pause");

    return 0;
}

要将double 作为参数传递,只需更改格式字符串中的print specifier

    double arg1 = 1.0f;
    sprintf(buffer, "C:\\system.exe %lf", arg1);

要传递多个参数,您需要包含一个额外的格式说明符并将参数传递给sprintf

    sprintf(buffer, "C:\\system.exe %s %s %i", arg1, arg2string, arg3int);

您的第二个程序也有问题,我认为它不会按您期望的方式执行。正如托马斯在他的评论中指出的那样,您将这些论点连接在一起,然后进行比较。如果您以system.exe hello there 执行它,那么baci 将是hello there,这似乎不正确。由于您只想查看是否已发送 Hello,因此您应该在循环中检查它,而不是连接字符串。

void main(int argc, char*argv[])
{       
    for(int i = 1; i < argc; i++)
        if (0 == strcmp(argv[i], "Hello"))
            cout << "Francesco, ti mando 4 baci !!!" << endl;   

    system("pause");
}

【讨论】:

  • 另一个问题是:baci += argv[i]; 它将连接所有参数,它们之间没有空格。我认为这不是 OP 想要的。
  • @ThomasMatthews 不是他想要的。我在编辑他的问题时注意到了这一点。现在为其添加注释。
  • @CaptainObvlious。抱歉,您的第一个示例无法编译。 “警告 C4129:'s':无法识别的字符转义序列”
  • @CaptainObvlious。完美的 !万分感谢 !是的,我没有看到 \ ... 具有所有 C++ 复杂性,谁在考虑它?抱歉打扰了。
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多