mikrocontroller.net

Forum: PC-Programmierung C++: tolower() Funktion Frage


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: tsepepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, ich habe hier einen C++ Codeausschnitt, kann mir jemand 
erklären was hier passiert? Das ganze macht für mich auf den ersten 
Blick keinen Sinn:

void tolower(string& s) // put s into lower case
{
   for (char& x : s) x = tolower(x);
}


Es wird der string s als Referenz übergeben und alle Zeichen des Strings 
sollen in Kleinbuchstaben umgewandelt werden. Wo passiert denn das? Ich 
sehe nicht dass irgendwas an s gemacht wird.
Und dann frage ich mich warum x eine Referenz ist, das macht in diesem 
Beispiel für mich irgendwie keinen Sinn.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
tsepepe schrieb:
> Wo passiert denn das? Ich
> sehe nicht dass irgendwas an s gemacht wird.

Da steht "char&", dadurch ist "x" eine Referenz auf das Zeichen in s. 
Das x wird geändert, d.h. das referenzierte Zeichen in s.

Autor: Test (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Der String s wird durchlaufen und jedes einzelne Zeichen des Strings 
wird mit tolower(x) durch einen Kleinbuchstaben ersetzt. Der String s 
wird in diesem Fall überschrieben, deswegen ist x eine Referenz.

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Dr. Sommer

Magst Du bitte einen Link posten, wo man das mal nachlesen kann?
Ist ':' ein nativer Operator oder einer der String-Klasse?
Oder was ganz Anderes?

(Ich habe selber gesucht,aber nichts dazu gefunden. Vermutlich weil ich 
an den falschen Stellen gesucht habe. z.B.: 
http://www.cplusplus.com/reference/string/string/ 
https://www.w3schools.com/cpp/cpp_operators.asp).

Autor: Vincent H. (vinci)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Theor schrieb:
> @ Dr. Sommer
>
> Magst Du bitte einen Link posten, wo man das mal nachlesen kann?
> Ist ':' ein nativer Operator oder einer der String-Klasse?
> Oder was ganz Anderes?
>
> (Ich habe selber gesucht,aber nichts dazu gefunden. Vermutlich weil ich
> an den falschen Stellen gesucht habe. z.B.:
> http://www.cplusplus.com/reference/string/string/
> https://www.w3schools.com/cpp/cpp_operators.asp).

https://en.cppreference.com/w/cpp/language/range-for

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Theor schrieb:
> Magst Du bitte einen Link posten, wo man das mal nachlesen kann?

https://en.cppreference.com/w/cpp/language/range-for

Theor schrieb:
> Ist ':' ein nativer Operator oder einer der String-Klasse?

Das ist kein Operator, und kann auch nicht überladen werden. Das ist ein 
fixes Sprachkonstrukt, welches mit allen Klassen funktioniert, für 
welche die Funktionen begin und end definiert sind, d.h. mit allen 
Containern & Arrays inklusive std::string.

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Vincent H. (vinci)
@ Dr. Sommer (Gast)

Danke sehr. :-)

Autor: tsepepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Da steht "char&", dadurch ist "x" eine Referenz auf das Zeichen in s.
> Das x wird geändert, d.h. das referenzierte Zeichen in s.

Danke, sehr einfach aber klar erklärt, habe es jetzt verstanden.

Die for-schleife hier ist ja die Kurzversion die es seit C++11/C++14 
gibt, wie würde der code aussehen wenn man die normale for-schleife von 
C++98 nehmen würde? Es handelt sich hier ja um einen string der 
verarbeitet wird, bei einem vector ist mir das schon klar .

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tsepepe schrieb:
> Es handelt sich hier ja um einen string der
> verarbeitet wird, bei einem vector ist mir das schon klar .

Dann schreib es für einen std::vector hin und guck, ob es die benötigten 
Funktionen auch für std::string gibt.

Autor: tsepepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh schrieb:
> Dann schreib es für einen std::vector hin und guck, ob es die benötigten
> Funktionen auch für std::string gibt.

Ich rede von der Elementweisen Verarbeitung von Vektoren, das hat doch 
mit Zeichenweiser Verarbeitung von Strings nichts zu tun.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tsepepe schrieb:
> Ich rede von der Elementweisen Verarbeitung von Vektoren, das hat doch
> mit Zeichenweiser Verarbeitung von Strings nichts zu tun.

Wieso nicht? Die Zeichen sind nichts anderes als die Elemente des
Strings.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
tsepepe schrieb:
> wie würde der code aussehen wenn man die normale for-schleife von
> C++98 nehmen würde?
void tolower(std::string& s) {
  for (std::string::iterator i = s.begin(); i != s.end(); ++i) {
    *i = std::tolower(*i);
  }
}

Ziemlich genau das wird auch aus der range-for-loop.

Autor: tsepepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> void tolower(std::string& s) {
>   for (std::string::iterator i = s.begin(); i != s.end(); ++i) {
>     *i = std::tolower(*i);
>   }
> }
>
> Ziemlich genau das wird auch aus der range-for-loop.

Klasse vielen Dank! Ich glaub ich nehm bei dir nen C++ Aufbaukurs :-p

Autor: tsepepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> void tolower(std::string& s) {
>   for (std::string::iterator i = s.begin(); i != s.end(); ++i) {
>     *i = std::tolower(*i);
>   }
> }
>
> Ziemlich genau das wird auch aus der range-for-loop.

Klasse vielen Dank! Ich glaub ich nehm bei dir nen C++ Aufbaukurs xD

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
tsepepe schrieb:
> Ich glaub ich nehm bei dir nen C++ Aufbaukurs xD

Gönn dir! C++ Seminare geben ist kein schlechtes Geschäftsmodell glaube 
ich :-)

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Yalu X. schrieb:
> tsepepe schrieb:
>> Ich rede von der Elementweisen Verarbeitung von Vektoren, das hat doch
>> mit Zeichenweiser Verarbeitung von Strings nichts zu tun.
>
> Wieso nicht? Die Zeichen sind nichts anderes als die Elemente des
> Strings.

Allerdings. Wenn man statt eines std::string einen std::vector<char> 
genommen hätte, würde der Code ansonsten exakt gleich aussehen.

tsepepe schrieb:
> Die for-schleife hier ist ja die Kurzversion die es seit C++11/C++14
> gibt,

Ja, nennt sich "range-based for".

Dr. Sommer schrieb:
> void tolower(std::string& s) {
>   for (std::string::iterator i = s.begin(); i != s.end(); ++i) {
>     *i = std::tolower(*i);
>   }
> }
> Ziemlich genau das wird auch aus der range-for-loop.

Der einzige Unterschied ist, dass das range-based for nicht direkt 
s.begin() aufruft, sondern begin(s).

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Der einzige Unterschied ist, dass das range-based for nicht direkt
> s.begin() aufruft, sondern begin(s).

Jo, das gibt's aber in C++03 nicht :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.