Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme beim Umgang mit 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 < [ 2 ]
000
01.11.2007, 16:47 Uhr
~Tino
Gast


Hallo!
Ich habe ein Problem bei der Nutzung von Strings.. Das vorliegende Programm soll eine Vignière verschlüsselung durchführen, aber aus irgendwelchen Gründen, überspringt das Programm nach der eingabe des Codes selbst das getchar() am ende, und schließt sich einfach... Ich dachte schon es liegt an falschen Indizes, weil dies ja manchmal zu undefiniertem Verhalten führen kann...
Ich hoffe auf eure Hilfe!
Grüße aus Magdeburg!


C++:
#include <iostream.h>
#include <string>
int main()
{
string a,b,c;
cout<<"Geben sie den Text ein!\n";
getline(cin,a);
cout<<"Geben sie den Code ein!\n";
getline(cin,b);
for (unsigned i=0;i<(a.length());i++)
{
   unsigned j=i;
   if (j>(b.length()-1))
       j=j-(b.length()-1);
   c.at(i)=a.at(i)+b.at(j);
}
cout<<c;
  getchar();
  return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.11.2007, 18:42 Uhr
0xdeadbeef
Gott
(Operator)


getchar ist da überhaupt nicht deklariert, und iostream.h gibt es auch spätestens seit 1998 nicht mehr...Das rausgenommen,

C++:
#include <iostream>
#include <string>

int main() {
// Wenns unbedingt sein muss. Besser: std::string, std::cout etc benutzen
  using namespace std;

  string a, b, c;

  cout << "Geben sie den Text ein!\n";
  getline(cin, a);

  cout << "Geben sie den Code ein!\n";
  getline(cin, b);

  for (unsigned i = 0; i < a.size(); ++i) {
    unsigned j = i;

    if(j > b.size() - 1) {
      j -= b.size() - 1;
    }

    c[i] = a[i] + b[j];
  }

  cout << c << endl; // stream flushen
  
  cin.get(); // getchar() für C++, wenn man so will
}


kompiliert und führt wartet am Ende sogar. Allerdings sind die funktionalen Bugs immer noch nicht behoben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 01.11.2007 um 18:56 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.11.2007, 18:48 Uhr
mischa
Fragender


zu langsam beim tippen
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.

Dieser Post wurde am 01.11.2007 um 18:48 Uhr von mischa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.11.2007, 18:55 Uhr
~Tino
Gast


Ich danke! nur leider führt es mich nicht sonderlich weiter, da er mir immer noch nich den verschlüsselten Text ausspuckt...

Eine Frage hätte ich jedoch noch:
macht die Zeile: c[i] += a[i] + b[j]; überhaupt das gleiche wie meine?! += und = sind ja doch recht unterschiedlich..

Und ich danke nochmals für die "Aktualisierungen", es wird bei uns an der Schule noch so gelehrt, ich wusste nicht, das das unaktuell ist...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.11.2007, 18:56 Uhr
0xdeadbeef
Gott
(Operator)


Eh, vertippt. Behebe das sofort. Funktionieren wird allerdings beides nicht.

Was die "Aktualisierung" angeht, <iostream.h> ist nicht nur einfach nicht aktuell, sondern schlicht und ergreifend falsch. string als Typ zu benutzen ohne using namespace std; ist ebenfalls falsch, alle stdlib-Symbole sind von Haus aus im namespace std, also heißt das eigentlich std::string, std::cout, std::endl, std::getline und std::cin.

Was die Fehler in deinem Code angeht, erstens ist in c (du solltest deinen Variablen echt sprechendere Namen geben) nicht genug Platz, um all die Zeichen aufzunehmen, zweitens rechnest du den Code nicht richtig aus - 'A' hat z.B. einen ASCII-Wert von 65, du wirst das erst auf den 0-25-Bereich der Vigenère-Verschlüsselung umrechnen, und danach wieder zurückrechnen müssen. Auch vermisse ich die Modulo-Rechnung...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 01.11.2007 um 19:01 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.11.2007, 19:15 Uhr
~Tino
Gast


Ich dachte Strings verwalten ihren Speicherplatz selber, sprich man kann eigentlich unbedenklich in sie reinschreiben?! wenn das nicht so wäre könnte ich doch gleich einen Array benutzen oder nicht?!
Und zu dem, dass ich den Code nicht richtig ausrechne: Ich hab mir das halt so gedacht^^ der Vigniere code besteht ja daraus das das Alphabet jeweils um x stellen verschoben wird, wobei x dem Buchstaben (oder dem Zahlenwert des Buchstabens im 0/25 Systems) entspricht. ich hab das nur auf den ASCI code ausgeweitet, damit man auch alle Zeichen nutzen kann. Es ist halt nur noch das Prinzip vom Vigniere Code, es stimmt jedoch, dass man ihn nicht mit Papier und Bleistift rein nach vigniere zurückrechnen könnte.

Irgendwie hab ich meinen Grundlegenen Fehler aber immer noch nicht erkannt.

Warum spuckt er mir c nicht aus, bzw. wieso kann ich in c nich beliebig viele buchstaben speichern?

Ich hoffe wirklich, dass ich das heute noch verstehe ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.11.2007, 19:35 Uhr
0xdeadbeef
Gott
(Operator)


Strings machen die Speicherverwaltung einfacher, und sorgen dafür, dass du - sofern du dich nicht sehr anstrengst - keine Speicherlöcher kriegst. Trotzdem haben sie zu jedem bestimmten Zeitpunkt eine bestimmte Länge, die ggf. manuell erweitert werden muss. Die einfachste Methode ist natürlich,

C++:
c += "was auch immer du anhängen willst";


allerdings weißt du ja in diesem Fall bereits, wie groß der String am Ende mal werden soll, also wär

C++:
c.resize(a.size());


vor der Schleife meines Erachtens sinnvoller, und dann halt einfach den []-Operator benutzen. Weder der []-Operator noch die .at()-Methode fordern von sich aus neuen Speicher an. Das wär auch garnicht so einfach/sinnvoll - stell dir vor, du hättest z.B. ne Stringkonstante.

Auch solltest du beachten, dass b nicht die gleiche Länge wie a haben muss.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.11.2007, 19:48 Uhr
Tino



Ich danke vielmals! Es funktioniert!
Habe mich nebenan mal angemeldet!

Und was gelernt^^

das b nich die gleiche Länge wie a haben muss hab ich schon beachtet:

C++:
    unsigned j = i;
    if(j > b.size() - 1)
    {
    j -= b.size() - 1;
    }



Nochmals vielen Dank! :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.11.2007, 20:38 Uhr
0xdeadbeef
Gott
(Operator)


Naja - das funktioniert aber nur, solange b.size() < a.size() * 2. Warum nimmst du nicht einfach i % b.size() ?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.11.2007, 21:54 Uhr
~Tino
Gast


weil niemand einen Schlüssel benutzt der Länger ist als der Text?

Nun denn, ich nochmal vielmals, und leg mich schlafen^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: