2012-11-24 6 views
1
#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"; 
    } 

"성공"이 인쇄되지 않습니다. 내가 실행하면 : -r $ ./hearts을 제공하는 유일한 것입니다 : 당신은 아마 strcmp는 두 문자열을 비교하려면명령 줄 옵션

+0

'=='로 문자열을 비교할 수는 없지만'C' /'C++ '의 세계에 오신 것을 환영합니다. D 또한 SO 프로파일에도 환영합니다 :) – LihO

답변

1

다음을 사용하여 시도해야합니다 :

if (strcmp(argv[1],"-r")==0) cout << "success\n"; 

리터럴 문자열 인수를 비교합니다.

1

-r

나를 sooo를 혼동한다. ==이 참일 경우 두 문자열은 동일한 메모리 위치를 참조해야합니다. "-r"은 컴파일 타임 상수이므로 발생하지 않습니다.

2

두 개의 포인터에서 ==을 사용하고 있기 때문입니다. 포인터가 같은지 아닌지, 같은 데이터에 있는지 여부를 검사합니다.

는 두 개의 C 문자열을 비교 같은 strcmp를 사용하려면

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

당신은 strcmp()를 사용해야하고 예상대로 작동합니다. ==을 사용할 때 포인터를 비교하면 같을 수 없습니다.

1

C에서 string은 문자 배열 (문자 시퀀스에 대한 포인터)입니다. 코드에서 항등 연산자는 절대적으로 다른 두 개의 포인터 값을 비교합니다. 당신은 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"; 
} 
+0

* C *에서 "문자열은 그냥 .. "하지만 std :: string은 * C++ *의 핵심입니다. –

+0

@pst 맞습니다. 감사. –

3

난 당신이 strcmp을 원하지 않는 가서 말할거야. 명령 줄 인수를 처리하는 C++ 방법은 가능한 한 빨리 std::string의로를 설정하는 것입니다 :

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 스타일 문자열의 내용을 비교하지는 않습니다.

+0

그럼'std :: endl'을 원하지 않는다고 말씀 드리겠습니다. 대신에''\ n ''을 사용하십시오 (더 짧습니다!). 그리고 옵션 구문 분석을 위해서는 아마도'ifopt /'else' 수표가 아닌'getopt'와 같은 것을 원할 것입니다. – melpomene

+0

@melpomene하지만 '\ n'은 스트림을 플러시하지 않습니다. –

+0

'cout'이 터미널 인 경우 작동합니다. 또한 프로그램이 어쨌든 끝내려고하기 때문에 여기서는 중요하지 않습니다. 모든 스트림을 플러시합니다. – melpomene

관련 문제