【问题标题】:How do I make a command line argument into a vector with each character as a different value?如何将命令行参数转换为每个字符作为不同值的向量?
【发布时间】:2020-05-06 21:29:55
【问题描述】:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
/*
void square(cLine, height){

}
*/
//void insertVector(vector<char> & cLine, )
int main(int argc, char *argv[]){
    if (argc != 5){
        cerr << "Incorrect number of arguments" << endl;
        return 1;
    }
    ofstream writeFile(argv[4]);
    if (!writeFile.good()){
        cerr << "Bad file, could not open" << endl;
        return 1;
    }
    int arrayLength = sizeof(argv[1]);
    vector<string> cLine;
    string cString(argv[1]);
    for(int i=0,i<arrayLength-2,++i){
        cLine.push_back(cString.substr(i,i+1));
    }
    cout << cLine << endl;
}

我正在尝试获取参数 argv[1] 并将其转换为向量,以便以后可以轻松拼接它,我知道该参数是 ac 样式的 char* 数组,但我不知道如何将其转换为一个向量,其中每个索引都是一个字符,但可以打印到控制台。

【问题讨论】:

  • 我想你的意思是strlen而不是sizeof
  • std::string 有一个构造函数,可以满足您的需求。
  • for(int i=0,i&lt;arrayLength-2,++i){ --> for(int i=0; i&lt;arrayLength-2; ++i) {
  • " 把它变成一个向量,这样我以后可以很容易地拼接它" 闻起来像 xy problem。你认为你可以用一个你已经拥有的字符串做不到的向量做什么?
  • 我很可能像你说的那样陷入了xy问题,作业的主要目标是从参数中制作形状,因此需要拼接。这是我使用 c++ 的第一周,我不知道用什么来完成它。

标签: c++ vector char command-line-arguments


【解决方案1】:

您可以从参数中创建std::strings(有点类似于std::vectors)。它会让你轻松做你想做的事。

我会参考构造函数编号@std::basic_string 和代码中的std::vector

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

int cppmain(std::string program, std::vector<std::string> args) {
    if(args.size() != 4) {
        std::cerr << "Incorrect number of arguments\n";
        return 1;
    }

    std::cout << program << " got arguments:\n";
    for(std::string& arg : args) {
        std::cout << " " << arg << "\n";
    }

    std::cout << program << " got arguments (alt. version):\n";

    for(size_t i = 0; i < args.size(); ++i) {
        std::cout << " " << args[i] << "\n";
    }

    std::cout << "the first argument, char-by-char:\n";

    for(char ch : args[0]) {
        std::cout << ch << '\n';
    }

    std::cout << "the first argument, char-by-char (alt. version):\n";

    for(size_t i = 0; i < args[0].size(); ++i) {
        std::cout << args[0][i] << '\n';
    }

    if(args[0].size() >= 6) {
        std::cout << "printing a range (start=2, length=4) of the first argument:\n";
        std::cout << args[0].substr(2, 4) << '\n';
    }

    return 0;
}

// Let main() create a std::string out of the program name (argv[0]) using
// std::string constructor 5
//
// and a std::vector<std::string> out of the arguments using
// std::vector constructor 5 (iterators).
//
// {argv+1, argv+argc}  becomes arguments to the  args  parameter in cppmain()
//
// argv+1    points at the first program argument argv[1] (the begin iterator)
// argv+argc points one step beyond the last program argument (the end iterator)

int main(int argc, char* argv[]) {
    return cppmain(argv[0], {argv + 1, argv + argc});
}

【讨论】:

  • 函数的参数是否使您在调用中放置的集合成为字符串向量?
  • @WillWalters 用一些解释更新了答案。
【解决方案2】:

此声明

int arrayLength = sizeof(argv[1]);

没有意义,因为sizeof(argv[1]) 等价于sizeof( char * ) 并且不会产生参数中的字符数。

此声明

cout << cLine << endl;

也没有意义,因为模板类std::vector没有重载operator &lt;&lt;

此外这个for循环

for(int i=0,i<arrayLength-2,++i){

语法不正确。

您需要的是以下内容

#include <cstring>

//…

std::vector<char> cLine( argv[1], argv[1] + std::strlen( argv[1] ) );
for ( const auto &c : cLine ) std::cout << c;
std::cout << '\n';

【讨论】:

  • 它编译正确,谢谢,但我在使用 cout 时仍然出现编译错误
  • 谢谢,你能解释一下 for 循环参数的含义吗?还说我只想打印向量的范围,例如。索引 2-4,我该怎么做?
  • @WillWalters 您可以只使用( char c : cLine )。要输出一个范围,您可以使用普通的 for 循环,例如 for ( std::vector::size_type I = 2; I
  • 使用向量报废而只使用字符串是否有意义。由于需要连接,并使用 substr 进行索引范围选择?
  • @WillWalters 随心所欲。如果您需要子字符串,那么只需创建一个 std::string 类型的对象,就像在您的程序中所做的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2015-09-07
  • 2021-10-31
  • 2020-06-27
相关资源
最近更新 更多