Я не могу сравнить 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"
Что не так с моим кодом?
В этом заявлении
if(argv[i]=="hello")
вы сравниваете указатели, потому что строковый литерал неявно преобразуется в const char * (или char * в C), который указывает на его первый символ. Поскольку два указателя имеют разные значения, выражение всегда ложно. Вместо этого вы должны использовать стандартную функцию C strcmp. Например
if( std::strcmp( argv[i], "hello" ) == 0 )
Чтобы использовать эту функцию, вы должны включить заголовок <cstring>
(в C ++) или <string.h>
(в С).
Строки нельзя сравнивать с ==
использовать зЬгстр:
if (strcmp(argv[i], "hello") == 0)
Ты должен #include <string.h>
Всякий раз, когда вы используете argv [i] == «hello», оператор «==» не принимает строку в качестве своего операнда, поэтому в действительности компилятор сравнивает указатель на argv [i] с указателем на постоянную строку «Hello», которая всегда false и, следовательно, полученный вами результат верен, для сравнения строковых литералов используйте функцию srtcmp.
int strcmp (const char * s1, const char * s2);
который сравнивает две строки s1 и s2. Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно меньше, соответствует или больше s2.