문제

이 매우 간단한 코드 :

#include <iostream>

using namespace std;

void exec(char* option)
{
    cout << "option is " << option << endl;
    if (option == "foo")
        cout << "option foo";
    else if (option == "bar")
        cout << "opzion bar";
    else
        cout << "???";
    cout << endl;
}

int main()
{
    char opt[] = "foo";
    exec(opt);
    return 0;
}

두 가지 경고를 생성하십시오 : 문자열 문자 그럴 결과와 비교하여 지정되지 않은 동작.

이 코드가 정확히 작동하지 않는 이유를 설명해 주시겠습니까?

char opt[]

에게

char *opt

작동하지만 경고를 생성합니까? 0 종료와 관련이 있습니까? OPT 선언의 차이점은 무엇입니까? Const Qualifier를 사용하면 어떻게됩니까? 해결책은 std :: string을 사용하는 것입니다.

도움이 되었습니까?

해결책

숯 배열 또는 문자 포인터는 C ++의 문자열 클래스 객체와 같은 것이 아니므로

if (option == "foo")

문자열을 비교하지 않습니다 option 문자열 리터럴 "foo"와 비교합니다. 주소option 문자열 문자 "foo"의 주소로. 옵션이 "foo"와 동일한 지 알고 싶다면 많은 문자열 비교 함수 중 하나를 사용해야합니다. strcmp 이 작업을 수행하는 명백한 방법이거나 사용할 수 있습니다. std::string 대신에 char*

다른 팁

당신이 사용할 수있는 == 사용하는 경우에만 문자열을 비교하는 연산자 std::string (좋은 관행입니다). C 스타일 char*/char [] 문자열을 사용하는 경우 C 함수를 사용해야합니다. strcmp 또는 strncmp.

당신은 또한 사용할 수 있습니다 std::string::operator == 비교하기 위해서 std::string C 문자열로 :

std string foo = "foo";
const char *bar = "bar";

if (foo == bar) 
   ...

그것이 작동하지 않는 이유는 비교가 줄을 비교하지 않고 문자 포인터를 비교하기 때문입니다.

그 이유 5월 CHAR*를 사용할 때의 작업은 컴파일러가 문자 그대로 "opt"를 한 번 저장하고 두 참조에 대해 재사용하기로 결정할 수 있기 때문입니다 (컴파일러가이를 수행하는지 여부를 나타내는 컴파일러 설정을 보았습니다).

char opt []의 경우, 컴파일러는 문자열 문자를 OPT 어레이 (아마도 스택에) 용으로 예약 된 저장 영역에 복사하여 포인터가 다릅니다.

렌즈

C ++ 문자열의 Java/C#에서 온 것 같습니다. C ++ 문자열은 문자가 저장되고 끝에 Null Char가있는 메모리에 대한 포인터 일뿐입니다. 문자열이 "보이면"동일하면 메모리의 다른 영역을 가리킬 수 있으며 동일하지 않습니다. 평등을 확인하려면 C ++의 클래스 std :: string 또는 c 함수 strcmp를 사용하십시오.

C ++의 경우 STD :: String을 사용합니다. 해결책:

#include <iostream> 
#include <string>

using namespace std; 

void exec(string option) 
{ 
    cout << "option is " << option << endl; 
    if (option == "foo") 
        cout << "option foo"; 
    else if (option == "bar") 
        cout << "option bar"; 
    else 
        cout << "???"; 
    cout << endl; 
} 

int main() 
{ 
    string opt = "foo"; 
    exec(opt);

    exec("bar");

    char array[] = "other";
    exec(array);
    return 0; 
} 

std :: string은 char [], char*등에서 스스로를 만드는 방법을 알고 있으므로 이러한 방식으로도 기능을 호출 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top