使用C++; 我有一个C++项目,以前接收了多个命令行参数,代码类似于: int main(int argc, char *argv[]) { for (int i = 1; i < 4; i = i + 1) { // do some stuff with argv[i] int in_arg = m[argv[i]]; } return 0 }

使用C++; 我有一个C++项目,以前接收了多个命令行参数,代码类似于: int main(int argc, char *argv[]) { for (int i = 1; i < 4; i = i + 1) { // do some stuff with argv[i] int in_arg = m[argv[i]]; } return 0 },c++,command-prompt,C++,Command Prompt,但是,由于将此代码插入到更广泛的项目中,我的命令行现在必须如下所示: C:\MyFolder\MyExecutable.exe 401 如何将参数401拆分为一个向量或类似对象,该向量或类似对象在功能上与具有三个输入参数(如4 0 1)相同,以便我的行: int in_arg = argv[i]; …可以重新打印到以下内容: int in_arg = new_vector[i]; 我只与C++对话,所以如果我问基本问题,就道歉。< /P> 谢谢您可以从参数中创建字符串s,只需逐个字符地查看

但是,由于将此代码插入到更广泛的项目中,我的命令行现在必须如下所示:

C:\MyFolder\MyExecutable.exe 401
如何将参数
401
拆分为一个向量或类似对象,该向量或类似对象在功能上与具有三个输入参数(如
4 0 1
)相同,以便我的行:

int in_arg = argv[i];
…可以重新打印到以下内容:

int in_arg = new_vector[i];
我只与C++对话,所以如果我问基本问题,就道歉。< /P>
谢谢

您可以从参数中创建
字符串
s,只需逐个字符地查看它们:

#include <iostream>
#include <string>
#include <vector>

int cppmain(std::string program, std::vector<std::string> args) {
    std::cout << program << " got " << args.size() << " argument(s):\n";

    for(auto& arg : args) {              // each argument as a string
        std::cout << " " << arg << '\n';

        for(char ch : arg) {             // each char in the current argument
            if(ch < 0) continue;         // skip negative char:s

            int in_arg = m[ch];          // assuming it was: int in_arg = m[*argv[i]];

            // use in_arg

        }
    }
    return 0;
}

int main(int argc, char* argv[]) {
    //
    //         string from char*
    //                |
    //                V
    return cppmain(argv[0], {argv + 1, argv + argc});
    //                      ^                     ^
    //                      |                     |
    //                     vector<string> from char*[]
}
#包括
#包括
#包括
int cppmain(std::string程序,std::vector args){

STD::CUT< P>如果您已经知道第一个参数是使用它的简单,将它复制到字符串,然后使用C++给出的迭代选项之一访问它,我使用Fruth类型循环:

#include <iostream>
#include <vector>

int main(int argc, char** argv)
{    
    if(argc < 2){
        std::cout << "Not enough arguments";  //<-- args check
        return 0;
    }
    std::string s1;
    s1 = argv[1]; //<-- copy argument to a string type to use string iterator
    std::vector<int> args_vector;

    for (char c : s1) {
        args_vector.push_back(c - '0'); // convert char to integer and save it in vector
    }

    for(int i: args_vector){ // print the args in integer format, 1 by 1
        std::cout << i << " ";
    }
    return 0;
}
#包括
#包括
int main(int argc,字符**argv)
{    
如果(argc<2){

std::cout每个参数都可以超过char的大小吗?而且参数也可以是例如40 10 12,如果是这样,下面的解决方案将生成401012->4 0 1 0 1 2,这是6个参数。@Nazim参数
401
在程序中显示为一个
char*
字符,指向4个
char
字符中的第一个:
'4',0',1',0'-因此没有溢出的风险。而且,如果只需要一个参数,那么只需要第一个参数。在
int In_arg=m[argv[i]];
中,我假设你的意思是
int In_arg=m[*argv[i]];
-正确吗?@tedlynmo否。为什么?因为
argv[i]
char*
*argv[i]
是一个
char
m[argv[i]]
如果你能编译它肯定会引起问题(未定义的行为)。你应该使用
static\u cast(c-'0')
而不是
static\u cast(c-48)
(实际上
c-'0'
是你真正需要的,因为它已经是
int
)我想这样更简单,我是simpler的超级粉丝。
#include <iostream>
#include <vector>

int main(int argc, char** argv)
{    
    if(argc < 2){
        std::cout << "Not enough arguments";  //<-- args check
        return 0;
    }
    std::string s1;
    s1 = argv[1]; //<-- copy argument to a string type to use string iterator
    std::vector<int> args_vector;

    for (char c : s1) {
        args_vector.push_back(c - '0'); // convert char to integer and save it in vector
    }

    for(int i: args_vector){ // print the args in integer format, 1 by 1
        std::cout << i << " ";
    }
    return 0;
}