strcpy verursacht Programmabsturz // Benutze eine char*
-
@buhl: da wird leider auf Groß und kleinschreibung geachted.....
-
Jud4s schrieb:
also^^.... cih will eine boolsche Variable rausbekommen (true/false) und zwar: ein false wenn die eingabe != Axt war...... (allerdings soll gross und kleinschreibung nicht beachted werden)
oder allgemein ausgedrückt:
Mein Ziel ist es einen string mit einem anderen zu vergleichen um einen boolschen wert (true/false) rauszubekommen.....
Du musst
!strcmp(...)nehmen, weil diese Funktion
truezurückgibt, wenn die Strings verschieden sind. Ich hab mich selber schon gefragt, was damit bezweckt wird
Um Gross- und Kleinbuchstaben als gleich anzusehen, solltest du eventuell noch eine Funktion schreiben, die alles in Gross- oder Kleinbuchstaben umwandelt und dann die beiden Strings so vergleicht. Oder gibts schon etwas in der Art?David_pb schrieb:
std::string (aka std::basic_string< char >) bieten die eine Funktion an, namentlich c_str(), die dir ein const char* liefert. Alternativ gibts aber auch String-Vergleichsfunktionalität für das Template in Form der Operatoren ==, !=, ...
Ich denke, der Threadersteller will es mit
charmachen, klar wärestd::stringeinfacher.
-
in meinem lehrbuch wird strcpy angeboten..... und ich dachte mir "hmm ist doch n dolle sache" vergleich ohne beachtung von gross und kleinschreibung.... benutzerfreundlich".... nur irgendwie habe ich was in der Anwendung falsch gemacht... konnte aber das Beispiel im Lehrbuch nicht konvertieren (Anpassen) das es mir hilft....
und ich dachte hier kennt einer den Befehl.....^^
-
Per std::string könnte es folgendermaßen aussehen:
std::cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << std::endl; //bool bogen; std::string axt; std::getline( std::cin, axt ); // string in Kleinbuchstaben umwandeln, vonwegen casesensitiv uswusf std::transform( axt.begin(), axt.end(), axt.begin(), std::tolower ); // true wenn text = 'axt', sonst false bool foobar = axt == "axt";Ansonsten benötigst du halt einen Speicherbereich in den du deinen String einlesen kannst. Reservieren könntest du z.B. per new[] operator.
Nexus schrieb:
weil diese Funktion true zurückgibt, wenn die Strings verschieden sind. Ich hab mich selber schon gefragt, was damit bezweckt wird

Ganz einfach. Es wird nämlich nicht true zurückgegeben wenn die String verschieden sind sondern Zahlen < oder > 0, je nachdem welcher String größer ist und 0 wenn die Strings gleich sind.
-
Jud4s schrieb:
also warum er auf keinen Speicher Zeigt ist mir zwar immernoch Rätselhaft
cout << "Willst du Axt oder Schwert?(Axt/Schwert)" << endl; char* axt; // <-- Dies ist ein uninitialisierter Zeiger der demzufolge irgendwo hinzeigt cin >> axt; // Ich bezweifel das es absicht ist in einen zufälligen Speicherbereich zu schreiben...Du solltest dich falls du wirklich mit C-Strings arbeiten willst erstmal ganz intensiv mit Zeigern beschäftigen.
Jud4s schrieb:
und strcmp kann man nur auf const char* anwenden

strcmp ist auch eine C-Funktion, das die nichts von C++ weiß ist nur logisch.
Entweder schreib C, oder C++ Code - mischen kann ich nur abraten.
Und std::string bringt schon einige Methoden und Operatorüberladungen mit (Sowas wie das aufaddieren mittels +, was mit C-Strings nicht geht...).Und Vergleichen: http://msdn.microsoft.com/de-de/library/ec100fs2.aspx
(Schau dir einfach das Beispiel an)cu André
-
ohh man bin ich blind
ich weiss warum mir das beispiel nicht helfen konnte... es war vollkommen richtig.... nur ihc habe einen buchstaben übersehen .....char schilda[10]; cin >> schilda; //schild = strcpy(schilda, "schild"); if(!stricmp(schilda, "schild"))so klappt es.... nur ich depp habe das i übersehen... dennoch thx für eure mühen....
@André thx.... aber ich glaube ich werde mich erstmal lieger ausführlihc mit cpp strings auseinander setzen.... Zeiger sind mir da doch n bsiche zu kompliziert....
kennst du rein zufällig ein Internettutorial??
-
Jud4s schrieb:
so klappt es.... nur ich depp habe das i übersehen... dennoch thx für eure mühen....
Also wenn du weiterhin C Programmierst, sind unsere Mühen eh vergeblich xD
-
Jud4s schrieb:
...
Was passiert eigentlich wenn du mehr als 10 Zeichen eingibst?

-
dann gibts n Crash schon klar bin ja nicht blööd

und wieso "wenn ich weiter c progge?" das ist eigtl meiner Ansicht nach cpp lass mich aber gerne belehren.... ;)^^
-
stricmp auf .c_str() ist doch besser und schneller als vorher erst alles toUpper zu machen
-
Jud4s schrieb:
und wieso "wenn ich weiter c progge?" das ist eigtl meiner Ansicht nach cpp lass mich aber gerne belehren.... ;)^^
Nun, das ist es durchaus. Allerdings verwendest du brandneue C++ Features gemischt mit der, der Abwärtskompatibilitätshalber mitgeschleppten, C-Funktionalität von C++. Auf solche Mixturen reagieren Leute teilweise alergisch.
-
was ist an meinem Qc denn noch alles an C-Teilstücken drinne die ich verändern sollte.... (um halt ein Lupenreines Cpp zu erhalten)......
-
Jud4s schrieb:
was ist an meinem Qc denn noch alles an C-Teilstücken drinne die ich verändern sollte.... (um halt ein Lupenreines Cpp zu erhalten)......
Eigentlich nur
char*und diestr...-Funktionen.coutundcingehören zu den Streams, das ist C++ und somit in Ordnung
Und zu
std::stringwürde ich dir sowieso raten, es bietet nicht nur mehr Funktionalität, sondern auch mehr Sicherheit und eine einfachere Anwendung.@ David_pb: Danke für die Erklärung von strcmp(). Obwohl ich diese Funktion so gut wie nie brauche, ist das interessant zu wissen. Die Abfrage auf Negation liess mich auf einen bool-Rückgabewert schliessen, deshalb war ich etwas verwirrt.
-
Hauptsächlich dein char-Array durch std::string ersetzen und den Vergleich über die Vergleichsoperatoren, nicht durch stricmp, ausführen. Aber wie gesagt... Es ist kein Muss.
-
keyy.. aber findet ihr nicht das in diesem falle die strimcp funktion wirklich mehr funktionalität bietet... ich kann das was ich machen will, (der vergleich von zwei strings ohne beachtung von gross und kleinschreibung) innerhalb eines Befehls machen. Mit der von euch vorgeschlagenen Möglichkeit habe ich nicht diese "Benutzerfreundlickeit".....oder?
-
std::string kannst du in die tonne kloppen.
-
David_pb schrieb:
Aber wie gesagt... Es ist kein Muss.
Aber ein Soll

Vor allem langfristig wirst du froh sein, wenn du
std::stringnutzen kannst. Kennen musst du es früher oder später sowieso, weil es auch in einigen Bibliotheken verwendet wird.Jud4s schrieb:
keyy.. aber findet ihr nicht das in diesem falle die strimcp funktion wirklich mehr funktionalität bieted... ich kann das was ich machen will (der vergleich von zwei strings ohne beachtung von gross und kleinschreibung) innerhalb eines Befehls machen, mit der von euch vorgeschlagenen Möglichkeit habe ich nicht diese "Benutzerfreundlickeit".....oder?
Doch, du kannst es sogar noch benutzerfreundlicher mit dem Vergleichsoperator == machen:
if (string1 == string2) // wobei string1 und string2 vom Typ std::string sindOder willst du unbedingt eine bool-Funktion, an die du zwei Strings übergeben kannst? Die wäre ja sehr schnell selber geschrieben.
ja schrieb:
std::string kannst du in die tonne kloppen.
Wieder einmal ein sehr hilfreicher Beitrag. Wenn du wenigstens Argumente hättest...

-
@Nexus:
Es geht ihm eher um einen caseinsensitiven Vergleich.
-
bei == wird da nicht auf gross und kleinschreibung geachtet??? Ihc meine schon.... sonst nehme ich das mit Kusshand... alleine weil es sich besser und verständlicher lesen lässt.....
-
Jud4s schrieb:
bei == wird da nicht auf gross und kleinschreibung geachtet??? Ihc meine schon.... sonst nehme ich das mit Kusshand... alleine weil es sich besser und verständlicher lesen lässt.....
So ist es.
Aber zur Not geht ja noch:if ( !stricmp( axt.c_str(), "axt" ) ) { }