Разбор аргументов из основного переполнения стека

Возможный дубликат:
C String — Использование оператора равенства == для сравнения двух строк на равенство

Основной вопрос здесь. Я компилирую эту программу в g ++ и запускаю ее с одним аргументом -r (./a.out -r), однако она не выводит указанный оператор cout ниже. Что-то не так с этим кодом?

#include <string>
using namespace std;

int main(int argc, char* argv[]) {

if (argv[1] == "-r" ) {
cout << "First arg is -r" << endl;
}

return 0;
}

1

Решение

Вы не можете сравнивать строковые литералы, используя ==потому что то, что это делает, это сравнить указатели (то есть адреса памяти, которые в этом случае всегда будут разными).

использование strcmp или сравнить std::string объекты вместо:

if (strcmp(argv[1], "-r") == 0) { ... }

или же

if (std::string(argv[1]) == "-r") { ... }
6

Другие решения

Вы не можете сравнивать строковые литералы с ==. Используйте strcmp.

(Также не забудьте проверить, что argc не меньше 2).

1

Одна ошибка в вашем коде — вы сравниваете адрес массива char вместо сравнения значений в массиве. Как люди говорили, вы можете сделать это C способ использования strcmp (хотя безопаснее использовать strncmp чтобы избежать переполнения буфера).

Тем не менее, это проще в использовании std::string в C ++.

Я бы скопировал аргументы в вектор строк.

#include <vector>
#include <string>

int main(int argc, char* argv[])
{
vector<string> args(argv, argv+argc);
...
1

Обычно вы делаете что-то вроде этого:

while (--argc && **++argv=='-')
{
char *p;
p=*argv+1;
switch(tolower(*p))
{
case 'r':
break;

}
}

в основном, пока остаются некоторые аргументы, проверьте, есть ли символ ‘-‘, затем включите следующий символ, чтобы увидеть модификатор (‘r’ или ‘a’ и т. д.)

0
По вопросам рекламы [email protected]