Vergleich mit String-Literal führt zu unspezifiziertem Verhalten?

7

Ich habe ein Problem mit dem Programm, das ich programmieren möchte. Es ist nur ein Windows-Konsolenprogramm und ich bin sehr neu in C ++. Es ist nur mein 4. Programm.

Das Problem, das ich habe ist, dass, wenn ich mein Programm laufen habe ich keine Fehler, aber viele Warnungen, die sagen "Vergleich mit String-Literal Ergebnisse in unspezifiziertem Verhalten" in den Zeilen, die ich unten hervorheben werde.

Wenn das Programm läuft, anstatt die Zahlen hinzuzufügen, die ich will, gibt es mir einfach eine zufällige große Zahl, egal was ich für meine Eingaben verwende.

Hier ist der Code:

%Vor%

Jede Hilfe wird geschätzt. Es ist wahrscheinlich etwas Großes, das ich falsch gemacht habe. Die Namen in den if-Anweisungen sind alle zur Zeit Platzhalter und ich werde viel mehr if-Anweisungen hinzufügen, wenn ich es mit der bare 6 arbeiten kann, was es braucht, um zu arbeiten.

    
user1742497 12.10.2012, 22:48
quelle

4 Antworten

12

In C ++ == nur intern implementiert für primitive Typen und Array ist kein primitiver Typ, daher vergleicht char[100] und String-Literal nur 2 char* oder besser als 2 Zeiger und seit dem 2 Zeiger können nicht gleich sein, dann kann items[n] == "ae" niemals wahr sein, stattdessen sollten Sie entweder std::string verwenden, um die Zeichenfolge wie folgt zu halten:

%Vor%

oder Sie sollten strcmp verwenden, um Strings zu vergleichen, aber erinnern Sie sich an strcmp return 0 für gleiche Strings, also lautet Ihr Code wie folgt:

%Vor%

Und eine zusätzliche Anmerkung ist if (items == 0) ist nutzlos, da items auf Stack und nicht im Heap allokiert ist!

    
BigBoss 12.10.2012, 23:18
quelle
5

Erstens ist int * price; ein fliegender Zeiger - Sie initialisieren ihn nie. Sie müssen tun:

%Vor%

Zweitens bezeichnet i normalerweise einen Iterator-Index, also schlage ich vor, dass Sie dabei bleiben - also

%Vor%

Drittens müssen Sie char-Arrays mit strncmp in Ihrem Fall vergleichen.

Vierte und wichtigste - verwenden Sie stattdessen std::string und std::vector . Das ist C ++, nicht C.

    
Luchian Grigore 12.10.2012 22:51
quelle
1

Sie vergleichen Zeiger, nicht die tatsächlichen Zeichenfolgen. Verwenden Sie C ++ string class anstelle von char* (oder überprüfen Sie Funktionsweise von C-Strings ).

    
m0skit0 12.10.2012 22:51
quelle
1

Nur eine kleine Sache, die mich ein wenig stolpern ließ, ist der Unterschied zwischen einfachen und doppelten Anführungszeichen, siehe: Einfache Anführungszeichen und doppelte Anführungszeichen in C oder C ++

Ich habe das erste Zeichen einer Zeichenkette mit doppelten Anführungszeichen und nicht einfachen Anführungszeichen verglichen - was zu der obigen Fehlermeldung führte.

    
alex 21.08.2013 07:40
quelle

Tags und Links