Char-Array switchen
-
Hallo, ist es möglich einzelne Elemente eines Char-Arrays zu switchen?
So hat es nicht geklappt:char temp[20];
switch (temp[1]){
...
}Eigentlich müsste es doch funktioniern, da es sich um einen Integer-Wert handelt.
Alllerdings geben mir Dev-cpp und Code Block eine Fehlermeldung, dass es sich nicht um einen Integer-Wert handelt. Gibt es noch eine andere Möglichkeit?
Vielen Dank im Vorraus
-
Das geht.
Zeig uns ein (komplettes, minimales) Beispiel, das Dein Compiler anmäkelt.
Vermutung: Deine case labels sind keine Konstanten.
-
Wenn du Hilfe erwartest, wäre es sinnvoll die genaue Fehlermeldung und den genauen Quelltext zu erfahren.
Ich nehme mal an, dass eines deiner case label so aussieht und keine integer constant expression (z.B.
'C'
oder'4'
) ist.char temp[20]; switch (temp[1]){ case temp[2]: // ... }
-
Das Problem habe ich jetzt gelöst (war ein Fehler von mir) trotzdem Danke.
Jetzt habe ich noch ein ähnliches Problem, ich will ein kleines Verschlüsselungsprogramm schreiben hier der Quellcode (in gekürzter Form):#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char *argv[]) { char a,b,c,d,e; char temp[5]; char temp2; int i; srand((unsigned)time(NULL)); a = 33 + (rand() % 93); b = 33 + (rand() % 93); c = 33 + (rand() % 93); d = 33 + (rand() % 93); e = 33 + (rand() % 93); //Zeichen werden in den Schlüssel geschrieben FILE*fp; fp = fopen("key.txt","a"); fprintf(fp,"%c%c%c%c%c",a,b,c,d,e); fclose(fp); //Jetzt wird eine Datei verschlüsselt //... //Schlüssel wird ausgelesen FILE*f; f = fopen("key.txt","r"); for(i=1;i<=5;i++){ temp[i] = fgetc(f); } fclose(f); //eine Datei wird entschlüsselt FILE*fz; fz = fopen("Datei.txt","r"); FILE*fw; fw = fopen("datei2.txt","a"); while((temp2 = fgetc(fz)) != EOF){ switch(temp2){ case temp[1]: temp2 = 'a';break; case temp[2]: temp2 = 'b';break; case temp[3]: temp2 = 'c';break; case temp[4]: temp2 = 'd';break; case temp[5]: temp2 = 'e';break; } fputc(temp2,fw); } fclose(fz); fclose(fw); return 0; }
Ich bekomme die Fehlermeldung: "case label does not reduce to an integer constant"
Habe ich jetzt wieder einen Fehler gemacht oder funktioniert das nicht?
Im richtigen Programm sind es viel mehr Zeichen, daher wäre es ohne Array ziemlich aufwändig.edit: hatte deinen Beitrag nicht gelesen @EinGast
-
Weiterer Fehler: Arrayindizes in C sind 0 basiert.
P.S.: Zu deinem Problem ein Tipp: 'a' + 1 == 'b' und so weiter (zumindest auf 99.99999% aller Systeme). Kommst du damit auf eine ganz einfache Schleifenlösung?
-
Meinst du in der Ascii-Tabelle? Ausser einer Abfrage mit if else fällt mir jetzt nichts ein.
-
C-Fritze schrieb:
Meinst du in der Ascii-Tabelle?
Das hat zwar etwas damit zu tun, dass das mal vor 50 Jahren so in die ASCII-Tabelle geschrieben wurde, aber so speziell meine ich das gar nicht. Worauf ich hinaus will: Buchstaben sind für den Computer Zahlen. Damit kann man rechnen. Tust du ja auch schon bei deiner Schlüsselerstellung. Und so kann man auch ganz einfach das Alphabet durchgehen, indem man von 'a' (oder 'A') aus immer um 1 weiter geht.
Ausser einer Abfrage mit if else fällt mir jetzt nichts ein.
Dann denk mal länger nach. so schwer ist das nicht. Noch eine Runde deutlicher: Wie kann man zig if-Abfragen der Art
if (temp2 == temp[0]) {temp2 = 'a' + 0; goto ende;} if (temp2 == temp[1]) {temp2 = 'a' + 1; goto ende;} if (temp2 == temp[2]) {temp2 = 'a' + 2; goto ende;} if (temp2 == temp[3]) {temp2 = 'a' + 3; goto ende;} // ... ende:
zusammenfassen? (Das goto dient hier nur dazu, um das break zu simulieren. Nicht nachmachen! In Schleifen/switch hast du break zur Verfügung)
-
Ich glaub jetzt weiß ich was du meinst:
while((temp2 = fgetc(fz)) != EOF){ for(j=0;j<=4;j++){ if(temp2 == temp[j]) { temp2 = ('a' + j); break;} } fputc(temp2,fw); }
-
Genau!
Aber Vorsicht:
while((temp2 = fgetc(fz)) != EOF)
temp2 ist bei dir ein char? Aber EOF und der Rückgabewert von fgetc sind vom Typ int. Das heißt, der Vergleich wird nicht unbedingt das tun, was du möchtest, da eventuell Information verloren geht. Mach aus temp2 einen int.
-
Ok, dachte es wäre egal.
Danke für die Hilfe
-
Falls sich jemand dafür interessiert, hier der Quellcode des fertigen Programms:
Random-Crypt.zip