Проблема с обработкой основных аргументов

Я не могу сравнить main() аргументы с const char* строки.

Простой код для объяснения:

#include <stdio.h>

int main(int argc, char *argv[])
{
int i;
if(argc>1)
{
for (i=1;i<argc;++i)
{
printf("arg[%d] is %s\n",i,argv[i]);
if(argv[i]=="hello")
printf("  arg[%d]==\"hello\"\n",i);
else
printf("  arg[%d]!=\"hello\"\n",i);
}
}
return 0;
}

Простая компиляция g++ test.cpp, Когда я пытаюсь выполнить это, я вижу следующее:

>./a.out hello my friend
arg[1] is hello
arg[1]!="hello"arg[2] is my
arg[2]!="hello"arg[3] is friend
arg[3]!="hello"

Что не так с моим кодом?

1

Решение

В этом заявлении

if(argv[i]=="hello")

вы сравниваете указатели, потому что строковый литерал неявно преобразуется в const char * (или char * в C), который указывает на его первый символ. Поскольку два указателя имеют разные значения, выражение всегда ложно. Вместо этого вы должны использовать стандартную функцию C strcmp. Например

if( std::strcmp( argv[i], "hello" ) == 0 )

Чтобы использовать эту функцию, вы должны включить заголовок <cstring>(в C ++) или <string.h> (в С).

1

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

Строки нельзя сравнивать с ==использовать зЬгстр:

if (strcmp(argv[i], "hello") == 0)

Ты должен #include <string.h>

2

Всякий раз, когда вы используете argv [i] == «hello», оператор «==» не принимает строку в качестве своего операнда, поэтому в действительности компилятор сравнивает указатель на argv [i] с указателем на постоянную строку «Hello», которая всегда false и, следовательно, полученный вами результат верен, для сравнения строковых литералов используйте функцию srtcmp.
int strcmp (const char * s1, const char * s2);
который сравнивает две строки s1 и s2. Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно меньше, соответствует или больше s2.

2