2013-06-28 3 views
1

Я новичок в cpp и имел проблему со следующим кодом. Обычно он должен отображать тексты в зависимости от argv [1], но он ничего не отображает.Почему не работает argv?

Что я делаю неправильно?

#include <stdio.h> 

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

    if(argv[1] == "a" && argc > 1) printf("hello world, argc: %d\n", argc); 
    else if(argv[1] == "2" && argc > 1) printf("hello everyone, argc: %d\n", argc); 

    for(int i=0; i<argc; i++) printf("%s\n", argv[i]); 

    return 0; 
} 
+6

Вам нужно использовать 'strcmp' вместо' == ' –

+0

@Andreas Очень быстро один :) – ha9u63ar

+4

Поскольку это помечено C++,' (std :: string (argv [1]) == "a") ' может быть более уместным. – Roddy

ответ

5

Использование strcmp, следующий код должен работать:

#include <stdio.h> 
#include <string.h> 

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

    if(argc > 1 && strcmp(argv[1], "a") == 0) { 
     printf("hello world, argc: %d\n", argc); 
    } else if(argc > 1 && strcmp(argv[1], "2") == 0) { 
     printf("hello everyone, argc: %d\n", argc); 
    } 

    for(int i=0; i<argc; i++) printf("%s\n", argv[i]); 

    return 0; 
} 

Поскольку вопрос помечается C++, использование что-то вроде следующего: C++-like:

#include <iostream> 
#include <string> 

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

    if(argc > 1) { 
     std::string argv1(argv[1]); 

     if (argv1 == "a") { 
      std::cout << "hello world, argc: " << argc << std::endl; 
     } else if (argv1 == "2") { 
      std::cout << "hello everyone, argc: " << argc << std::endl; 
     } 
    } 

    for(int i=0; i<argc; i++) { 
     std::cout << argv[i] << std::endl; 
    } 

    return 0; 
} 
+0

Большое спасибо :). – www

+0

Не более понятно :) – www

+0

Ops. теперь он не показывает результат, даже если я отправил аргумент «a» в качестве входных данных: «./helloWorld» a или './helloWorld a' не входит ни в одну из ветвей. – www

3

2 наиболее важные вопросы с вами код:

  • Вы ДОЛЖНЫ проверить количество аргументов ДО аргументов проверки.
  • Строки сравниваются с использованием стандартных библиотечных функций, таких как strcmp() или даже лучше strncmp() если вы знаете максимальную длину.

Адрес Код C, который работает. Надеюсь, эта помощь.

#include <stdio.h> 
#include <string.h> 

int main (int argc, char* argv[]) 
{ 
    if ((argc > 1) && ((strcmp(argv[1], "a") == 0))) 
    { 
     printf("hello world, argc: %d\n", argc); 
    } 
    else if ((argc > 1) && (strcmp(argv[1], "2") == 0)) 
    { 
     printf("hello everyone, argc: %d\n", argc); 
    } 

    for (int i = 0; i < argc; i++) 
     printf("%s\n", argv[i]); 

    return 0; 
} 

Некоторые детали сравнения строк. Если вы используете оператор == (если вы его не перегрузили), вы просто сравниваете адреса объектов (смотрите внимательно, у вас есть char * в обоих случаях). Очевидно, что ваш строковый литерал и буфер аргументов имеют разные адреса. Вам нужно сравнить содержимое. На самом деле в C++ вы можете построить std::string и использовать оператор сравнения.

Так другое решение, более C++, что работает на основе == оператора:

#include <stdio.h> 
#include <string> 

int main (int argc, char* argv[]) 
{ 
    if ((argc > 1) && (std::string(argv[1]) == "a")) 
    { 
     printf("hello world, argc: %d\n", argc); 
    } 
    else if ((argc > 1) && (std::string(argv[1]) == "2")) 
    { 
     printf("hello everyone, argc: %d\n", argc); 
    } 

    for (int i = 0; i < argc; i++) 
     printf("%s\n", argv[i]); 

    return 0; 
} 
+0

+1 - поймал меня на 18 секунд :) –

+1

@Andreas У вас все еще был шанс. Он помечен C++, а не C ^^. – a3f

+2

@ a3f Выполнено - см. Выше: D –