#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
cout << argv[1] << endl;
if (argv[1]=="-r") cout << "success\n";
}
«успех» не распечатывается. Когда я бегу: $ ./hearts -r
единственное, что выходит:
-р
что меня так смущает
Вы должны попробовать использовать:
if (strcmp(argv[1],"-r")==0) cout << "success\n";
сравнить аргумент со строковым литералом.
Я собираюсь пойти дальше и сказать вам, что вы не хотите strcmp
, Способ обработки аргументов командной строки в C ++ — превратить их в std::string
s как можно скорее:
int main(int argc, const char* argv[])
{
// Make a vector of all command-line arguments
std::vector<std::string> args(argv, argv+argc);
// Now we can use std::string's operator==
if (args.size() > 1 && args[1] == "-r") {
std::cout << "Success" << std::endl;
}
return 0;
}
Вы можете сравнить два std::string
с ==
оператор. В случае args[1] == "-r"
, const char[]
строковый литерал преобразуется в std::string
для сравнения. В вашем коде argv[1]=="-r"
сравнивает два независимых указателя, которые не будут равны — он не сравнивает содержимое строк в стиле C.
Это потому, что вы используете ==
на двух указателях. Он проверит, равны ли указатели, а не совпадают ли точки на тех же данных.
Чтобы сравнить две строки C, используйте strcmp
как это:
if (strcmp(argv[1], "-r") == 0)
Вы, вероятно, хотите strcmp
сравнить две строки. За ==
чтобы быть правдой, ваши две строки должны ссылаться на одну и ту же область памяти, что не может произойти, так как "-r"
является константой времени компиляции.
Вы должны использовать strcmp()
и это будет работать как положено. Когда вы используете ==
Вы сравниваете указатели, и они не могут быть одинаковыми.
В Си строка — это символьные массивы (указатели на последовательность символов). В вашем коде оператор равенства сравнивает только два значения указателя, которые абсолютно разные. Вы должны использовать strcmp
функция или использование string
учебный класс:
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <cstring> // <-- here
using namespace std;
int main(int argc, char* argv[])
{
cout << argv[1] << endl;
if (strcmp(argv[1], "-r") == 0) // <-- and here
cout << "success\n";
}
ИЛИ ЖЕ
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include <string> // <-- here
using namespace std;
int main(int argc, char* argv[])
{
cout << argv[1] << endl;
if (string(argv[1]) == "-r") // <-- and here
cout << "success\n";
}