C++ Array aus Strings, erstes Zeichen untersuchen

unXtremo

Ensign
Registriert
Feb. 2009
Beiträge
228
Hallo Zusammen,
ich bin mir sicher, das diese Frage irgendwo schon einmal gestellt wurde, trotzdem konnte ich nach meiner Suche keine Antwort finden.

Vielleicht kann mir jemand schnell auf die Sprüge helfen, das wäre echt nett. (bitte keine google doch nach ... Beiträge, das kann ich selbst)

Wie im Titel steht habe ich ein Array (aus der <vector>-Klasse) vom Typ string.

Ich möchte nun das Array in einer for-Schleife durchlaufen und jeweils den Stringanfang überprüfen ob es sich um eine Zahl handelt:

Code:
locale loc;
...
vector<string> feld;
...
for(int i = 0; i < feld.size(); i++) {
    // wenn feld[i] eine pos. oder neg. Zahl ist
    if(feld[i][0] == "-" || isdigit(feld[i][0],loc)) {
        // tue irgendwas
    }
}
...

Leider bekomme ich bei der if-Abfrage den Fehler das ein Vergleich zw. Zeiger und Ganzzahl vorkommt.

Wie kann ich das beheben?
Kann ich mit [0] überhaupt auf das erste Stringelement zugreifen?

Schon mal Danke
Gruß
unXtremo
 
Hi, versuch es mal mit
Code:
if(feld[i].at(0) == '-' || isdigit(feld[i].at(0),loc)) {
// tue irgendwas
}
Vergiss nicht die einfachen Anführungszeichen um das Minus, da ein String an der Stelle 0 ja nur ein char ist.
 
Finde den Unterschied:
Code:
 locale loc;
 vector<string> feld;
 for(size_t i=0; i<feld.size(); i++) {
    // wenn feld[i] eine pos. oder neg. Zahl ist
    if( feld[i][0] == '-' || isdigit(feld[i][0], loc) ) {
       // tue irgendwas
    }

 }
 
Code:
std::vector<std::string> vec;
for(const auto & str : vec) {
  if(str.empty()) continue;
  if(std::isdigit(str[0]) || (str.size() >= 2 && str[0] == '-' && std::isdigit(str[1])) {
    //do something
  }
}

Wenn du den Wert des Strings als Zahl willst, würde ich aber gleich mit sowas wie std::atoi arbeiten…
 
Hallo zusammen!

Vielen Dank für eure hilfreichen Antworten!!!

Das mit den Anführungszeichen habe nich natürlich mal wieder verkehrt gemacht.
Das at für die Positionsangabe werde ich noch ausprobieren.
Was mir size_t für Vorteile bringt habe ich auch noch nicht verstanden, ist dieser Typ Speicherplatz schonender, weil er wirklich nur maximal so groß sein kann wie mein String in dem Fall?
@ QDOS:
Da liegst du genau richtig, das kommt bei mir dann im tu irgendwas Teil, wo ich die Zahlen entsprechend auswerten und umwandeln werde.

Vielen Dank euch allen
 
unXtremo schrieb:
Was mir size_t für Vorteile bringt habe ich auch noch nicht verstanden, ist dieser Typ Speicherplatz schonender, weil er wirklich nur maximal so groß sein kann wie mein String in dem Fall?

Es ist ganz einfach der selbe Datentyp, den auch std::vector::size() zurückgibt. http://www.cplusplus.com/reference/vector/vector/size/


P.S. std::vector::size_type ist einfach nur ein typedef für std::size_t

P.S. #2: Rein theoretisch könntest du mal auf einen vector stoßen, der 3 Milliarden Einträge hat. Auf einem 32-Bit-System würde deine Schleife mit int das nicht packen, weil int dann auf 2 Milliarden und ein paar zerquetschte begrenzt ist. size_t hingegen ist vorzeichenlos und kann so die volle, maximal mögliche Größe eines Vectors (4 Milliarden und noch was) widerspiegeln.
 
Zuletzt bearbeitet:
Zurück
Oben