Передача bash параметров в c ++ - PullRequest
1 голос
/ 21 февраля 2020

Я попытался передать два параметра из bash в программу на c ++, но не могу заставить ее работать точно. Я бы использовал команду ./bash "Turtle" "Cat" в командной строке linux.

#!/bin/bash
./main.out $1 $2

Но файл C ++ будет читать только ./main.out из argv. cout будет просто печатать обрезанные версии ./main.out, такие как ./main.out, затем /main.out и затем main.out. Я неправильно использую параметры при размещении файла bash?

int main(int argc, char *argv[]) {
    cout << argv+0 << endl;
    cout << argv+1 << endl;
    cout << argv+2 << endl;
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

Это потому, что вы не печатаете аргументы как строки, вы печатаете их ячейки памяти . В clang ++ - 9 (что я тестировал) это происходит, когда указатель передается в std :: cout, во многих компиляторах (MSV C, поправьте меня, если я не прав), это просто ничего не печатает.

Вам нужно сослаться на него как на индекс массива и напечатать, что

int main(int argc, char **argv) {
    cout << argv[0] << endl;
    cout << argv[1] << endl;
    cout << argv[2] << endl;
    return 0;
}

Приведенный выше код прекрасно работает для меня (передача аргументов вручную при выполнении) при компиляции с помощью clang ++ - 9 , Если вы собираетесь использовать этот код, вы также должны проверить, что есть как минимум 3 аргумента (значение argc), в противном случае вы можете указать на недопустимую память при индексации argv

Также попробуйте избежать std :: endl и вместо этого используйте "\ n", std :: endl без необходимости очищает буфер и не требуется в 99% случаев

2 голосов
/ 21 февраля 2020

Ваш bash файл в порядке. Проблема в вашем C ++. Попробуйте что-то вроде этого:

#include <iostream>

int main(int argc, char **argv) { 
    std::cout << argv[1] << "\n";
    std::cout << argv[2] << "\n";
}

[предупреждение: это не проверяет на наличие ошибок, поэтому, если вы не передадите какие-либо параметры, оно будет плохо себя вести.]

1 голос
/ 21 февраля 2020

char *argv[] - указатель указателей (такой же как char **argv), вам нужно

cout << argv[1] << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...