Frage

Dieses sehr einfache Code:

#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;
}

erzeugen zwei Warnung:. Vergleich mit Stringliteral Ergebnisse in nicht näher bezeichnete Verhalten

Können Sie erklären, warum genau dieser Code nicht funktioniert, aber wenn ich ändern

char opt[]

char *opt

es funktioniert, aber erzeugt die Warnung? Ist es in das Verzeichnis \ 0 Kündigung zu tun? Was ist der Unterschied zwischen den beiden Erklärung opt? Was passiert, wenn ich const Qualifier benutzen? Die Lösung ist die Verwendung std :: string?

War es hilfreich?

Lösung

char-Arrays oder char-Pointer sind nicht wirklich die gleiche wie String-Klasse Objekte in C ++, so diesen

if (option == "foo")

Enthält die Zeichenfolge option zum Stringliteral „foo“ nicht vergleichen, vergleicht er die Adresse von option mit der Adresse des Stringliteral „foo“. Sie müssen eine der vielen String-Vergleichsfunktionen verwenden, wenn Sie wissen wollen, ob die Option das gleiche wie „foo“ ist. strcmp ist die offensichtliche Art und Weise, dies zu tun, oder Sie können std::string statt char* verwenden

Andere Tipps

Sie können == Operator verwenden Zeichenfolgen zu vergleichen, nur wenn Sie std::string verwenden (was eine gute Praxis ist). Wenn Sie C-Stil char * / char [] Strings, müssen Sie C-Funktionen verwenden strcmp oder strncmp.

Sie können auch die std::string::operator == verwenden std::string mit einem C-String zu vergleichen:

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

if (foo == bar) 
   ...

Der Grund, warum es nicht funktioniert, weil der Vergleich Saiten nicht zu vergleichen ist, sondern Zeichenzeiger.

Der Grund, warum es können Arbeit, wenn Sie char *, weil der Compiler die Zeichenkette „opt“ einmal zu speichern, kann beschließen, und wiederverwenden es für beide Referenzen (ich bin sicher, ich habe einen gesehen Compiler-Einstellung irgendwo, der angibt, ob der Compiler dies der Fall ist).

Im Fall von char opt [], der Compiler kopieren die Stringliteral in den Speicherbereich für das Opt-Array reserviert (wahrscheinlich auf dem Stapel), die die Zeiger verursacht, anders zu sein.

Renze

Sieht aus wie Sie kamen aus Java / C # :) In C ++ String ist nur ein Zeiger auf Speicher, in dem Zeichen gespeichert ist, und mit Null-Zeichen am Ende. Wenn Strings „Look“ gleich können sie auf verschiedene Bereiche im Speicher zeigen und nicht gleich sein. zur Überprüfung Gleichheit entweder Verwendung von C ++ s Klasse std :: string oder C-Funktion strcmp.

Für C ++ Ich würde die std :: string Lösung :

#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 weiß, wie sich der char erstellen out [], char *, etc, so dass Sie immer noch die Funktion auf diese Weise aufrufen können, auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top