Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » stringverknüpfen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.02.2007, 17:59 Uhr
Suba Esel



Mir ist eben was aufgefallen, was mich etwas wundert:

Ich hab ein Programm, das nach jedem Buchstaben eines eingegebenen Textes ein Leerzeichen einfügen soll.


C++:
#include <iostream>

int main()
{
    std::cout << "Gib einen Text ein!" << std::endl;
    std::string start;
    std::getline(std::cin, start);

    std::string ende = "";

    for (unsigned int i = 0; i <= sizeof(start); ++i)
    {
        ende += start[i] + " ";
    }

    std::cout << ende;
}



Wenn ich das Programm so benutze, lautet die Ausgabe wie folgt:
Eingabe: Ausgabe:
asdf _string::copyc_string::comparering::copyng::copy
asdfasdf _string::copyc_string::comparering::copyng::copy_string::copy
1234 @,↑@↑@
12341234 @,↑@↑@@
etc.

Wenn ich dagegen statt
Code:
ende += start[i] + " ";

Code:
(ende += start[i]) + " ";
nehme, ist Eingabe == Ausgabe, offenbar wird durch die Klammerung das += wirkungslos.

Wenn ich
Code:
ende = ende + ....
mache, funktioniert alles tadellos.

Wenn ich
Code:
ende += start[i];
ende += " ";
nehme, funktioniert auch alles.

Woran liegt das?

EDIT: Statt ↑ steht da ein Pfeil nach oben, das Forum hat den "etwas" verändert.
--
Simon

Dieser Post wurde am 04.02.2007 um 18:03 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.02.2007, 19:31 Uhr
0xdeadbeef
Gott
(Operator)


start[i] ist ein char. Das heißt, start[i] + " " ist eine Speicheradresse ein paar Byte hinter " ". Ansonsten würd ich hier wahrscheinlich am ehesten mit ostringstream arbeiten, also

C++:
#include <sstream>

// ...
std::ostringstream osstr;
for(std::string::iterator i = start.begin(); i != start.end(); ++i) {
  osstr << *i << ' ';
}
std::string padded = osstr.str();


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.02.2007 um 19:33 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.02.2007, 20:26 Uhr
Suba Esel




Zitat:
start[i] ist ein char. Das heißt, start[i] + " " ist eine Speicheradresse ein paar Byte hinter " ".



Und wieso funktioniert das dann mit
Code:
ende = ende + ....
, und warum liegt in dem Speicher an der Stelle dann diese komische Sache von wegen _string::copyc_string::comparering::copyng::copy? Ist das halt der Speicher, der für die Verarbeitung von dem String zuständig ist, oder wie?
--
Simon

Dieser Post wurde am 04.02.2007 um 20:55 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.02.2007, 20:43 Uhr
Pablo
Supertux
(Operator)



Zitat von Suba Esel:

Zitat:
start[i] ist ein char. Das heißt, start[i] + " " ist eine Speicheradresse ein paar Byte hinter " ".

:HAE:

Und wieso funktioniert das dann mit
Code:
ende = ende + ....



weil ende ein std::string ist und start[ i ] ein char, auf std::string wurde der + Operator überladen, auf char eben nicht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.02.2007, 20:51 Uhr
0xdeadbeef
Gott
(Operator)


Weil

C++:
ende = ende + start[i] + " ";


sich für den Compiler wie

C++:
ende = (ende + start[i]) + " ";


liest, und ende + start[i] ein std::string ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.02.2007, 20:55 Uhr
Suba Esel



Ach so ok, dann ists klar.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.02.2007, 21:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


for (unsigned int i = 0; i <= sizeof(start); ++i)

das dürfte dir wenn du pech hast auch schieflaufen - sizeof(start) wird halt zu irgendwas expandiert. die länge des strings ist start.length()
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.02.2007, 11:06 Uhr
Suba Esel



Ok, ich hatte es erst mit !start.eof() probiert, aber das ging nicht. Warum eigentlich? start[i]!='\0' tuts auch...
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.02.2007, 16:53 Uhr
0xdeadbeef
Gott
(Operator)


Nicht zwangsläufig, ein std::string kann locker auch 0-characters enthalten (ist im Gegensatz zu C bytecounted, und nicht zwangsläufig null-terminiert).

BTW, ich würd mir, ähnlich wie ++i statt i++, eher start.size() als start.length() angewöhnen, weil alle STL-Container size() haben, aber nur string length() kennt. Du wirst es mir danken, wenn du anfängst, template-Algorithmen zu schreiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: