Programmieren c++ substitutionsverfahren

...komplette Frage anzeigen

1 Antwort

char str[255];
cin.getline(str,strlen(str)); 

http://www.cplusplus.com/reference/istream/istream/getline/

Liest die komplette Eingabe inkl. der Leerzeichen ein.

Das Problem scheint nicht das Einlesen sondern die Substitution zu sein. Dafür wäre der Code wie Wutklumpen schreibt ganz gut

0

Die merkwürdigen Zeichen kommen übrigens daher, dass du dein char-array vermutlich nicht "null-terminierst".

Ein Char-Array muss als letztes Char immer ein '\0' besitzen. Damit terminiert der String. Beim Anlegen des char-Arrays musst du das Array immer so dimensionieren, dass dieses ein Zeichen mehr fasst, als der Text lang ist, damit du noch '\0' anhängen kannst.

0
@raz667

Wenn man richtige C++-Strings (also keine Char-Arrays) nimmt, dann muss man sich nicht um das terminieren kümmern. Ansonsten kann ich mich der Forderung vom Wutklumpen nur anschließen.

0
@raz667

Er verwendet aber offensichtlich welche. Und davon mal ab: Es ist nicht verkehrt, darüber Bescheid zu wissen. An vielen Stellen kommt man nämlich nicht drum rum, char Arrays ein zu setzen.

0
@ceevee

Ich habe char-arrays verwendet. Wo genau muss ich das mit der 0 hinschreiben? Und wo muss das getline() hin? Ich habe Letzteres eben ausprobiert, aber entweder ich habe es an die falsche Stelle geschrieben, oder es funktioniert nicht :( Also hier der Code:

// Substitutionsverfahren.cpp: Hauptprojektdatei.

include "stdafx.h"

include

using namespace std;

void chiffrieren()

{ int verschiebung; char text[151]; char weiter [151]; cout << "Bitte geben Sie ein, um wie viele Stellen die Buchstaben verschoben werden sollen." <<endl; cin >> verschiebung;

    if (verschiebung>26)

{   
    cout << "Die von Ihnen eingegebene Zahl ist zu gro\xE1." << endl;
}
    else if (verschiebung<1)
{ 
    cout << "Die von Ihnen eingegebene Zahl ist zu klein." << endl;
}
    else if (verschiebung==3)
{
    cout << "Sie haben sich f\x81r eine Verschiebung um drei Stellen entschieden. Bereits C\x84sar benutzte dieses Verfahren. Daher werden solcherlei Substitutionsverfahren auch als C\x84sar-Verschiebungen bezeichnet" <<endl;   
    cout << "Bitte geben Sie nun den zu verschl\x81sselnden Text ein.(Maximal 150 Zeichen)" << endl;
    cin >> text;
    cout << endl;
    cout << text << endl;
    system("PAUSE");
}
    else
{ 
    cout << "Sie haben eine Verschiebung von + " <<endl; 
    cout << verschiebung << "gew\x84hlt." <<endl;
    cout << "Bitte geben Sie nun den zu verschl\x81sselnden Text ein.(Maximal 150 Zeichen)" << endl;
    cin >> text;
    cout << endl;
    cout << text << endl;
    system("PAUSE");
}

int i=0;
while (text[i] !=0)
{
    weiter[i]= text[i];
    for (int v=0; v<verschiebung; v++)
{
    weiter[i]++;
    if (weiter[i]>0x7a)
        weiter[i]=0x61;
}
    i++;

} cout << weiter <<endl; system("PAUSE"); }

void dechiffrieren() { int verschiebung; char text[150]; char weiter[150];

cout <<"Bitte geben Sie ein, um wie viele Buchstaben die Botschaft verschoben werden soll." <<endl;
cin >> verschiebung;

if (verschiebung>26)
{
    cout <<"Die von Ihnen angegebene Verschiebung ist zu gro\xE1." <<endl;
}
else if (verschiebung<1)
{ 
    cout <<"Die von Ihnen angegebene Verschiebung ist zu klein." <<endl;
}
else if (verschiebung==3)
{
    cout << "Sie haben sich f\x81r eine Verschiebung um drei Stellen entschieden. Bereits C\x84sar benutzte dieses Verfahren. Daher werden solcherlei Substitutionsverfahren auch als C\x84sar-Verschiebungen bezeichnet" <<endl;   
    cout << "Bitte geben Sie nun den zu verschl\x81sselnden Text ein.(Maximal 150 Zeichen)" << endl;
    cin >> text;
    cout << endl;
    cout << text << endl;
    system("PAUSE");
}
else
{
    cout<< "Sie haben eine Verschiebung um " <<endl;
    cout << verschiebung << "angegeben." <<endl;
    cout << "Geben Sie nun die zu entschl\x81sselnde Botschaft ein.(maximal 150 Zeichen)" <<endl;
    cin >> text;
    cout << endl;
    cout << text << endl;
        system("PAUSE");
}
int i=0;
while (text[i] !=0)

{
    weiter[i]=text[i];

    for (int v=0; v<verschiebung; v++)
    {
        weiter[i]--;
        if (weiter[i]<0x61)
            weiter[i]=0x7a;
    }
    i++;
}
cout << weiter <<endl;
    system("PAUSE");

}

int main () { cout <<"Chiffrieren und Dechiffrieren mittels Substitution" <<endl;

cout <<"Bitte w\x84hlen Sie eine Option aus:" <<endl;
cout<< "Chiffrieren<1>" <<endl;
cout << "Dechiffrieren<2>" <<endl;
cout <<"Programm beenden<3>" <<endl;

int eingabe;
cin >>eingabe;

if (eingabe==1)
{
    cout<< "Chiffrieren" <<endl;
    chiffrieren();
}
else if(eingabe==2)
{
    cout<< "Dechiffrieren" <<endl;
    dechiffrieren();
}
else if(eingabe==3)
{
    cout <<"Auf Wiedersehen!" <<endl;
}
else 
{
    cout <<"Diese Option steht nicht zur Auswahl." <<endl;
}
return 0;

}

0
@enteenteente2

anstatt cin >>eingabe schreibst du cin.getline(eingabe,strlen(eingabe)); cin.getline gibt keinen String zurück, sondern schreibt aus dem Stream direkt in die Variable, die du in Parameter angegeben hast.

Parameter 1 ist das Char-Array in das geschrieben werden soll, Parameter 2 gibt an, wieviel Zeichen eingelesen werden sollen.

cin.getline terminiert den CString automatisch. Ansonsten würdest du es so machen:

"Hello World" besitzt inkl. dem Leerzeichen 11 Zeichen. Um den String zu speichern würdest du ein Char Array anlegen mit der Größe 12 um \0 zu speichern.

einlesen... terminieren: charArr[12] = '\0';

0
@raz667

Komisch, also irgendwas mache ich wohl trotzdem falsch. Wenn ich jetzt cin.getline(text,strlen(text)); statt cin<< text; schreibe, wird der Eingabe schritt an dieser Stelle einfach übersprungen.

0
@enteenteente2

Ich würd vorschlagen, dass du erstmal den Umgang mit den Strings,CStrings und deren Methoden in einer seperaten Datei ausprobierst. Erst wenn du es verinnerlicht hast, würd ich das dann in in's bestehende Programm einbauen. Sonst findest du dich hinterher garnicht mehr zurecht. ;)

0

Was möchtest Du wissen?