[C] Eingabe: Auf Enter warten

11/11/2013 20:08 Belur#1
Hey E*pvpers.

Bin angefangen zu studieren und wir sollten die Caesar Verschlüsselung programmieren.
Das klappt auch soweit ganz gut.
Hab das so gemacht:

PHP Code:
char a[] = "abcdefghijklmnopqrstuvwxyz";
char c[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

void caesar(int verschiebung){
char b[32];                                      

printf("Bitte zu verschlüsselnden Text eingeben\n");
fflush(stdout);
fgets(b32stdin);


if(
verschiebung<0){
    
int zs verschiebung*-1;
    
verschiebung 26-zs;
    if(
verschiebung<0){

        
verschiebung verschiebung*-1;
    }

}

int i=0;
int j=0;
int k=1;
for(
i=0i<(strlen(b)-2); i++){


    while(
j<26 && k==1){

        if(
a[j]==b[i]){

            if((
j+verschiebung)>25){
                
int differenz=(j+verschiebung)%26;
                
b[i]=a[differenz];
                
k=0;

            }else{
                
b[i]=a[j+verschiebung];
                
k=0;
            }


        }
        if(
c[j]==b[i]){

            if((
j+verschiebung)>25){
                
int differenz=(j+verschiebung)%26;
                
b[i]=c[differenz];
                
k=0;
            }else{
                
b[i]=c[j+verschiebung];
                
k=0;
            }

        }
        
j++;
    }
    
j=0;
    
k=1;
}
printf(b);
}



int main(int argccharargv[]) {
    
char puffer[5];
    
printf("Bitte Verschiebung eingeben\n");
    
fflush(stdout);
    
fgets(puffer32stdin);
    
int zahl atoi(puffer);

    
caesar(zahl);
    return 
0;


Ich weiß, dass hätte man sicherlich noch besser machen können, aaaber für mich reicht das erstmal. Wir fangen bescheiden an.

Nun war die Aufgabe, dass man einen verschlüsselten Text hat, und den entschlüsseln soll.
Wollte also eine Methode machen, die das die Methode "caesar" aufruft. Wenn man Enter drückt, wird die Methode wieder aufgerufen, nur der Parameter um eins erhöht.

Man drückt also so lange Enter bis ein lesbarer Text zum vorschein kommt. Zmdst denke ich, dass das das Ziel sein soll :D

Meine Frage also:

Wie "lausche" ich auf die Eingabe von Enter. ??
Hoffe mir kann da jmd helfen

Grüße
11/12/2013 22:26 XxharCs#2
Ceaser Funktion boolean Wert zurückgeben lassen, um falls das Ende erreicht wurde(also kein Text mehr zum vorscheinen), ein true zurück zu geben. Dann sollte es so aussehen(Theorie mäßig).
Code:
bool ende;
while(true)
{
    if(getchar() == '\r' || getchar() == EOF)
    {
        ende = caesar(zahl);
        if(ende == true)
        {
            break;
        }
    }
}
Du müsstest aber sehr viel an deinem Code ändern! Wieso willst du es immer einzeln ausgeben und nicht gleich alles, wie mans auch normal macht? :D

Falls ich dich missverstanden hab, dann sry.
11/13/2013 00:44 MrSm!th#3
Afaik unterstützt C kein bool.
Dafür benötigt er stdbool.h (wenn ich den Header richtig im Kopf habe) oder halt einfach eine int Variable, die er auf 1 oder 0 setzt (anders ist BOOL sowieso nicht definiert).

Ich frage mich gerade, wozu du die Variable ende verwendest, wenn du sowieso eine Endlosschleife in Verbindung mit break nutzt. Sinnvoller wäre, die Variable im Schleifenkopf abzufragen und die break Anweisung wegzulassen.

@TE
Ich verstehe nicht ganz, wie du auf die Idee kommst, caeser mit einem um 1 erhöhten Wert erneut aufzurufen. Zum Entschlüsseln müsstest du eher um dieselbe Anzahl wie vorher in umgekehrter Richtung schieben.
11/13/2013 09:32 XxharCs#4
Quote:
Originally Posted by MrSm!th View Post
Afaik unterstützt C kein bool.
Dafür benötigt er stdbool.h (wenn ich den Header richtig im Kopf habe) oder halt einfach eine int Variable, die er auf 1 oder 0 setzt (anders ist BOOL sowieso nicht definiert).
Jop. C99 unterstützt bool mit dem stdbool Header. Man kann sich auch einfach ein bool zusammen basteln, weil wie du schon sagst es eine Variable ist die man auf 1 oder 0 setzt.
Code:
typedef int bool;
#define true 1
#define false 0
Quote:
Originally Posted by MrSm!th View Post
Ich frage mich gerade, wozu du die Variable ende verwendest, wenn du sowieso eine Endlosschleife in Verbindung mit break nutzt. Sinnvoller wäre, die Variable im Schleifenkopf abzufragen und die break Anweisung wegzulassen.
Stimmt, habs anscheinend übersehen. :p