2016-11-22 1 views
-2

So haben wir eine optionale Zuordnung in unserer C++ - Klasse. Die Zuordnung ist im Grunde diese:Iterieren durch Zeichen einer Zeichenfolge in einem Vektor gespeichert, um Zeichen zu ersetzen C++

Write a program that holds a string of at least 8 words. 
    Do the following: 

    1. Replace the letters of first word with '?' 
    2. Turn the letters of the last word to uppercase 

Wir haben noch nicht studieren Vektoren in unserer Klasse.

Als ich zuerst die Aufgabe las, schien die Speicherung der Strings in einem Vektor eine gute Idee zu sein, also ging ich damit um.

Um die Zeichen durch ein '?' Ich habe eine for-Schleife benutzt. Ich weiß, dass das nicht funktionieren würde, wenn ich nur bestimmte Zeichen oder jedes andere Zeichen zu einem '?' Ändern müsste.

Mein Problem ist mit Konvertieren von Zeichen einer Zeichenfolge in Großbuchstaben. Mein Denkprozess war: For-Schleife durchläuft alle Zeichen im letzten Wort, wenn das Zeichen in Kleinbuchstaben ist, wird es in Großbuchstaben umgewandelt, wenn es bereits in Großbuchstaben ist, ändert es sich nicht.

Ich glaube, dass mein Ansatz für dieses Problem funktionieren könnte, ich habe mich vielleicht einfach nicht korrekt ausgedrückt oder irgendwo einen dummen Fehler gemacht. Könnte mir jemand helfen oder mich in die richtige Richtung drängen? Welche anderen Optionen gibt es, um alle Zeichen eines in einem Vektor gespeicherten Strings zu durchlaufen? Gibt es einen anderen Ansatz, der dafür besser funktionieren könnte? Vielen Dank für Ihre Zeit.

#include <vector> 
#include <cctype> 
#include <string> 
#include <iostream> 

using namespace std; 

vector<string>words; 

//stores words to vector words 
void storeWords() 
{ 
    cout << "Input 8 words: " << endl; 
    string s = " "; 
    for(int i=0; i<=7; i++) 
    { 
     cin >> s; 
     words.push_back(s); 
    } 
} 
//prints our words 
void printWords() 
{ 
    cout << "\n Words stored in vector: " << endl; 
    for (const string s : words) 
     cout << s << endl; 
} 

//replaces chars of the first word with a '?' sign 
void replace1(vector<string>&v) 
{ 
    cout << "\nReplaced characters of the first word " << words[0] << " with '?'" << endl; 
    for (char c : words[0]) 
     cout << "?"; 
} 

void replace2(vector<string>&v) 
{ 
    for (char c : words[7]) 
    { 
     if(islower(c)) 
      c = toupper(c); 
    } 
    cout << endl; 
    cout << words[7]<<endl; 
} 


int main() 
{ 
    storeWords(); 
    printWords(); 
    replace1(words); 
    replace2(words); 

    return 0; 
} 
+0

Warum iterieren nicht nur über String, von Anfang an und vom Ende bis zum ersten Leerzeichen der entsprechenden Änderungen zu tun? Was Ihre Frage betrifft, so vermissen Sie '&' in den for-Schleifen, um Ihre 'c'-Variable an den tatsächlichen Wert in der Zeichenfolge zu binden, anstatt sie zu kopieren. – Gasper

+2

Jahr Code tut nicht, was die Aufgabe sagt. Es heißt "Schreibe ein Programm, das eine Kette von mindestens 8 Wörtern enthält." es heißt nicht "frage nach 8 Wörtern".Sie müssen eine Zeile lesen (getline) die Wörter verschüttet und die ersten und letzten identifizieren – pm100

+0

replace1 scheint wie ein Cheat, Sie haben die gespeicherte Zeichenfolge nicht geändert. – pm100

Antwort

3

c = toupper(c) wird c der Groß Wert zuweisen. Die Änderung c wird jedoch nicht ändern, was sich in words[7] befindet. Sie können dies umgehen, indem Sie direkt auf das Zeichen verweisen (char &c).

void replace2(vector<string>&v) 
{ 
    for (char &c : words[7]) { 
     c = toUpper(c); 
    } 
    cout << endl; 
    cout << words[7]<<endl; 
} 

Beachten Sie auch, dass Ihre Anforderungen sind eine Reihe von mindestens 8 Worte zu halten. So words[7] wird wahrscheinlich am Ende wie words[words.size() - 1] aussehen.

+1

das scheint mir richtig - jemand anderes downvotes ohne Kommentar tho – pm100

+0

Wow. Ich sah dies als die andere Art von "for" -Schleife, und dann änderten Sie es ... um meiner Antwort zu entsprechen ... – Charles

+0

@ c650 Es ist eine Weile her, seit ich C++ gemacht habe. Ich habe deine Antwort nach diesem Schnitt tatsächlich gesehen. Ich habe gesehen, dass jemand in den Kommentaren diese Lösung erwähnt hat. Es war eindeutig besser als mein vorheriges Beispiel, lokale Kopien zu erstellen, also ja, ich habe meine Antwort bearbeitet. Gab dir immer noch die +1. :) – Gavin

3

Diese

for (char c : words[7]) 

Sollte sein:

for (char& c : words[7]) 

Die erste Version ändert eine lokale Variable, während der zweite die tatsächlichen Zeichen in words[7] ändert.

Der kleine Ampersand (&) macht c ein Verweis auf ein bestimmtes Zeichen in words[7], so dass Sie c, wie Sie es words[7][some_i] ändern.

Auch sollte ich hinzufügen, dass Ihre replace Funktionen nicht brauchen, dass vector Argument.

Ideone Example with that change

Verwandte Themen