Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kopieren von Ausschnitten aus Strings?

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
05.03.2011, 21:22 Uhr
Yadgar



High!

Ich habe folgendes Problem:

Der Benutzer gibt eine Zeitangabe im Format MIN['|:]SEK ein, das Programm soll aus diesem String einen short-Integer mit der Anzahl der Sekunden berechnen.

Ich lasse also nach dem ' bzw. : suchen:


C++:
trenner = l.find("'");
if (!trenner) trenner = l.find(":");



Damit bekomme ich eine Ganzzahl, die die Position des Minutentrennzeichens im String l darstellt. Jetzt würde ich gerne den Minutenteil, also l[0] bis l[trenner-1] als separaten String aus l kopieren. Gibt es dafür eine fertige Methode von string?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.03.2011, 23:33 Uhr
0xdeadbeef
Gott
(Operator)


Klar, nennt sich substr:

C++:
std::string m = s.substr(0, trenner); // Von Zeichen 0, trenner Zeichen lang


Allerdings ließe sich das Ganze auch einfacher haben. Beispielsweise

C++:
short minuten, sekunden;
char dummy;

std::istringstream parser("10:20");

parser >> minuten >> dummy >> sekunden;

if(!parser || dummy != ':') throw something;

sekunden += minuten * 60;


std::istringstream findest du im Standard-Header <sstream>.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.03.2011, 00:30 Uhr
Yadgar



High!

[quote 0xdeadbeef]Klar, nennt sich substr:

C++:
std::string m = s.substr(0, trenner); // Von Zeichen 0, trenner Zeichen lang



So weit, so gut... aber jetzt stelle ich fest, dass ich mich beim Rückgabetyp von string.find wohl völlig vertan habe! Bevor ich euch jetzt weiter mit einem dämlichen DAU-Fragen nerve, würde ich erst einmal gerne wissen, wo ich eine umfassende Dokumentation wenigstens der gebräuchlichsten C++-Bibliotheken finde...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.03.2011, 03:46 Uhr
0xdeadbeef
Gott
(Operator)


Ich benutze üblicherweise

www.sgi.com/tech/stl/table_of_contents.html
http://cplusplus.com/reference/

...oder schlage direkt im Standard nach, den man bei der ISO erwerben kann. Alternativ dazu ist "The C++ Programming Language" von Bjarne Stroustrup (dem Erfinder von C++) eine sehr gute Referenz.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.03.2011, 18:53 Uhr
Yadgar




Zitat von 0xdeadbeef:
Ich benutze üblicherweise

www.sgi.com/tech/stl/table_of_contents.html
http://cplusplus.com/reference/



Die letztgenannte Seite habe ich dann auch gefunden... aber wenn ich mir den Rückgabetyp von string.find ansehe, schlackere ich nur noch mit den Ohren... was bitte soll denn size_t sein?

Mein Code sieht vorerst so aus:


C++:
unsigned short gesamtsekunden(string l)
{
  string min;                       // Minuten als Teilstring
  string sek;                       // Sekunden als Teilstring
  unsigned short minuten=0;         // Minuten als Zahl
  unsigned short sekunden=0;        // Sekunden als Zahl
  unsigned short gesamt;            // Summe der Sekunden
  unsigned short trenner;           // Position des Trennzeichens (' oder :)
  unsigned short i;                 // Zählervariable
  
  trenner = l.find("'");
  if (!trenner) trenner = l.find(":");
  if (!trenner)
  {
    cerr << "Falsches Eingabeformat! Daten bitte im Format MM'SS oder MM:SS eingeben!";
    return 0;
  }
  
  i=trenner-1;
  cout << "Trenner bei: " << i << endl;

  min = l.substr(0, trenner);
  cout << "Minuten als String: " << min << endl;

  while (i<=trenner)
  {
    minuten += (unsigned short)(l[i]-48)*pow(10, trenner-i);
    i++;
  }
  
  cout << "\nMinuten als Zahl: " << minuten << endl;



Wenn ich für laenge eingebe: 30:32
bekomme ich für trenner: 65534

Ich vermute mal, da muss stehen trenner = 65535-trenner;

Seltsam...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.03.2011, 23:30 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von Yadgar:
was bitte soll denn size_t sein?


bei meinem Compiler steckt das hier dahinter:


Zitat von cstdio:


C++:
  typedef unsigned size_t;





also nichts anderes als eine vorzeichenlose ganze Zahl. Bei anderen Compilern ist es nicht viel anders.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 06.03.2011 um 23:31 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.03.2011, 16:03 Uhr
0xdeadbeef
Gott
(Operator)


Wenn das gesuchte Zeichen nicht gefunden wird, wie es bei der Eingabe von "20:32" hier der Fall ist:

C++:
trenner = l.find("'");


gibt std::string::find std::string::npos zurück, welches als static_cast<std::string::size_type>(-1) definiert ist. Nach Umrechnung Modulo 2^Breite, wie es der Standard vorschreibt, kommt dabei die größte Zahl raus, die in einen std::string::size_type passt. Plattformabängig ist davon auszugehen, dass das derzeit entweder 2³² - 1 oder 2⁶⁴ - 1 ist. Wenn du das dann in einen unsigned short von 16 Bit Breite stopfst, kommt dabei halt 65535 raus - dieses ist ungleich Null, dementsprechend wird das hier:

C++:
  if (!trenner) trenner = l.find(":");
  if (!trenner)
  {
    cerr << "Falsches Eingabeformat! Daten bitte im Format MM'SS oder MM:SS eingeben!";
    return 0;
  }


gar nicht erst ausgeführt. Schlussendlich wird mit trenner == 65535

C++:
i=trenner-1;


zu 65534, und damit hast du deine Ausgabe.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.03.2011 um 16:04 Uhr von 0xdeadbeef editiert.
 
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: