C - String in Textdatei schreiben

Hi,

also ich programmier' noch nicht soo lange und habe gerade ein Problem bei folgendem Programm:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <ctype.h>
#include <time.h>

#define MAX_STRING 500

int main()
{
    FILE *stream;
    char s[500];
    strcpy(s, " ");
    char key;
    int keyi, i;
    
    printf("Gib den zu verschluesselnden Text ein :\n\n");
    gets(s);
    printf("\n\nWelchen Schluessel wollen Sie verwenden (a-z) >> ");
    key=getchar();
    system("CLS");
    switch(key)
          {
           case 'a': case 'A': keyi=1; break;
           case 'b': case 'B': keyi=2; break;
           case 'c': case 'C': keyi=3; break;
           case 'd': case 'D': keyi=4; break;
           case 'e': case 'E': keyi=5; break;
           case 'f': case 'F': keyi=6; break;
           case 'g': case 'G': keyi=7; break;
           case 'h': case 'H': keyi=8; break;
           case 'i': case 'I': keyi=9; break;
           case 'j': case 'J': keyi=10; break;
           case 'k': case 'K': keyi=11; break;
           case 'l': case 'L': keyi=12; break;
           case 'm': case 'M': keyi=13; break;
           case 'n': case 'N': keyi=14; break;
           case 'o': case 'O': keyi=15; break;
           case 'p': case 'P': keyi=16; break;
           case 'q': case 'Q': keyi=17; break;
           case 'r': case 'R': keyi=18; break;
           case 's': case 'S': keyi=19; break;
           case 't': case 'T': keyi=20; break;
           case 'u': case 'U': keyi=21; break;
           case 'v': case 'V': keyi=22; break;
           case 'w': case 'W': keyi=23; break;
           case 'x': case 'X': keyi=24; break;
           case 'y': case 'Y': keyi=25; break;
           case 'z': case 'Z': keyi=26; break;
           default : printf("Sie haben einen falschen Schluessel eingegeben! Programm wird beendet! \n\n");
                     goto end2;
                     break;
          }
    
    for(i=0; i<MAX_STRING; i++)
       {
        s[i]=s[i]+keyi;
       }
    system("CLS");
    stream = fopen("verschlüsselter Text.txt", "w");
    for(i=0; i<MAX_STRING; i++)
       {
        fputc(s[i], stream);
       }
    end1:
    fclose(stream);
    system("CLS");
    printf("Der Text wurde erfolgreich verschluesselt und ist in der Datei \n''verschluesselter Text.txt'' zu finden !\n\n\n");
    end2:
    system("PAUSE");
    return 0;
}

Und zwar ergibt das Programm bei folgendem Input:

Text: blub
Key: a

folgende Ausgabe in der Textdatei:

cmvc￾??AE;]Fjhfof!p usw.

Nun die Frage:
Warum tut es das?^^
Und wie kann ich das beheben?

die ersten 4 buchstaben sind ja richtig (jeder buchstabe um 1 im ASCII-code erweitert), aber woher kommt der rest?

?: Mit fprintf() funktioniert's auch nicht, hab ich vor fputc() schon probiert.

dankeschön...

mfg,
marco
 
Du definierst MAX_STRING als 500. Und dann nimmst du eine For-Schleife, die von 0 bis MAX_STRING bzw. 500 läuft.
Da s aber nur definiert wird und nicht mit z.B. Leerzeichen gefüllt wird, sind in s lauter zufällige Zeichen, so wie sie grade im Speicher liegen.
Dein Script nimmt den Input und überschreibt die ersten Zeichen in s. Der Rest bleibt so zufällig, wie er war. Und dann gibst du s aus. Na, was kommt dann wohl raus? :rolleyes:

Edit:
Grade sehe ich in Zeile 15, dass du strcpy verwendest. Ließ dir mal die Referenz zu dem Befehl durch:
http://www.cplusplus.com/reference/clibrary/cstring/strcpy.html
Du kopierst ein Leerzeichen in einen 500 Zeichen langen String. Also wird nur das erste Zeichen ein Leerzeichen. Der Rest bleibt, wie oben beschrieben, mit zufälligen Werten gefüllt.
 
Außerdem wuerde ich deinen Code etwas anders schreiben, zb so:

Code:
if(isalpha(key)!=0)
   keyi=(int)toupper(key)-0x40;
else printf("kein buchstabe\n");
Damit faellt dein gesamter Switch-teil weg. Und mach entweder in Zeile 15 statt strcpy() memset() und in Zeile 63 for(i=0;i<=strlen(s); i++)
 
Ok, danke ihr zwei, das mit strcpy hab' ich übersehen und die Lösung für den switch-Teil .. sowas hab ich mir schon immer gewünscht =P

mfg,
marco
 
Zurück
Oben