Как сделать аргумент командной строки в векторе с каждым символом в качестве другого значения? - PullRequest
1 голос
/ 20 января 2020
#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] и превратить его в вектор, чтобы потом можно было легко объединить его, я понимаю, что аргумент представляет собой массив c style *, но я не Как преобразовать его в вектор, в котором каждый индекс является в точности символом, но который можно распечатать на консоли.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Вы можете создать std::string s (что несколько похоже на std::vector s) из аргументов. Это позволит легко делать то, что вы хотите.

Я буду ссылаться на номера конструкторов @ std :: basic_string и std :: vector in код.

#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});
}
0 голосов
/ 20 января 2020

Это объявление

int arrayLength = sizeof(argv[1]);

не имеет смысла, поскольку sizeof(argv[1]) эквивалентно sizeof( char * ) и не дает количество символов в аргументе.

Это утверждение

cout << cLine << endl;

также не имеет смысла, поскольку нет перегруженного operator << для класса шаблона std::vector.

Более того, это для l oop

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';
...