# String umwandeln



## hg197 (29. Januar 2008)

Hallo,

ich bin zur Zeit dabei mir ein Tool zu basteln, das eine einfach Art von Verschlüsselung beinhalten soll. Mein Problem ist hierbei, dass ich eine Zeichenkette mit Buchstaben in eine mit Zahlen umwandeln möchte, und diese später wiederum in Buchstaben. Ist dies realisierbar, oder falls nicht, ist es möglich Buchstaben in einer Zeichenkette zu tauschen? Vielleicht a in x , b in g, etc und das dann evtl wieder umwandeln. Ich bin kein Informatiker, daher meine nicht ganz so exakten Kentnisse. Vielen Dank für die Hilfe 

Wichtig: Ich schreibe den Code für das Tool in C.


----------



## XeoX (29. Januar 2008)

Du könntest das über die Ascii Zeichen Tabell machen, jeden Buchstaben in über Type-Cast in eine Integer variable casten und dann den Ascii code um eine bestimmte anzahl verschieben und anschließend wirde zurück casten. Musst nur darauf achten das es nur 256 Zeichen geben kann!


----------



## hg197 (29. Januar 2008)

Das hört sich gut an...wie genau macht man dieses Type-cast?
Das Ganze soll nach direkter Tastatureingabe umgewandelt werden, bevor es in eine Datei geschrieben wird.


----------



## XeoX (29. Januar 2008)

Könnte so gehen!


```
#include <stdio.h>
#include <string.h>
int main (void){
int index, integer[81];
char string[81];

printf("Bitte String eingeben: ");
gets(string);

for (index=0; index < strlen(string); index++){
integer[index] = (int) string[index];
printf("Buchstabe: %c\n", string[index]);
printf("Ascii: %d\n\n", integer[index]);
}
gets(string);
return 0;
}
```


----------



## hg197 (29. Januar 2008)

Interessant...kann ich diesen Array dann einfach in eine Datei schreiben und später wieder auslesen? Bzw. kann ich diesen Array auch als Hex oder Oktale Zahl schreiben?
Hoffentlich bin ich nicht zu anspruchsvoll


----------



## XeoX (29. Januar 2008)

so kannst du dir das in Hex und Okt ausgeben lassen, 

```
#include <stdio.h>
#include <string.h>
int main (void){
int index, integer[81];
char string[81];

printf("Bitte String eingeben: ");
gets(string);

for (index=0; index < strlen(string); index++){
integer[index] = (int) string[index];
printf("Buchstabe: %c\n", string[index]);
printf("Ascii: %d\n", integer[index]);
printf("In Hex: %0x\n", integer[index]);
printf("In Oktal: %o\n\n", integer[index]); //kleines 'O'
}
gets(string);
return 0;
}
```

jetzt muss du nur noch eine Datei öffnen und dann mit mit fprintf in die Datei schreiben und anschließend alles mit fgets auslesen!

XeoX


----------



## hg197 (29. Januar 2008)

Das is wahnsinn! Danke für die schnelle Hilfe :-D . Muss mich heute leider mit was anderem befassen, aber morgen wirds prompt in die Tat umgesetzt.

Ich hatte übrigens ein Problem mit der Schleife:

```
do{
                            gets(lager);               
                            fprintf(Speicher,"%s",lager);
                            if(strcmp(lager,ENTER)== strcmp(ENTER,ENTER)){break;};             
                            }while(lager!=ENTER);
```
mit: char lager[400]; und char ENTER="#";
und Speicher als Zieldatei.

Das Problem ist, dass die Schleife ohne den strcmp-Vergleich kein Ende findet. Den musste ich behelfsmäßig nachträglich einbauen. Die -while Bedingung greift irgendwie nicht, wenn ich # eingebe.

EDIT: Wie bekomme ich diese cpp-code Umgebung? Das sieht irgendwie bei weitem übersichtlicher aus.


----------



## XeoX (29. Januar 2008)

Versuch es mal so:

```
do{
gets(lager);
fprintf(Speicher,"%s",lager);
}while(strcmp(lager, ENTER));

//oder

do{
gets(lager);
fprintf(Speicher,"%s",lager);
}while(lager[0] != ENTER);
```

Wenn du etwas mit gets einliest wir immer ein "\0" angehängt, das ist das Zeilenwechsel Zeichen. Aufgrud dessen kann ein vergleich nicht funktionieren!

Die Erste möglichkeit ist dabei die schönere!

Und für solche vergleiche mit festen Zeichen, solltest du den Präprozessorbefehl 
"#define" nutzen!

Break Anweisungen, sind kein schöner Code, ist kein Standard!
Den CODE bekommst du so:
[ kürzel ] code [/ kürzel] und das Kürzel ist cpp!

XeoX


----------



## hg197 (30. Januar 2008)

Aso, danke dir ;-). Die while Bedingung mit lager[0] hatter ich auch schon durchprobiert, aber das ging auch nicht. Mal sehen, ob es mit dem anderen Vergleich geht. Erfolgsbericht folgt...


----------



## hg197 (30. Januar 2008)

Super, die Schleife hat funktioniert. Beim Auslesen habe ich noch ein Problem. Wie lese ich die komplette Datei bis zum ende aus? Ich dachte an etwas wie:


```
int i=0;
                            do{
                            if(strcmp(lager, ENTER)){i++;};
                            fscanf(Speicher,"%s",&lager);
                            printf("%d. %s",i,lager);
                            
                            }while(fscanf(Speicher,"%s",&lager) == EOF);
```

Aber es geht nicht...


----------



## hg197 (30. Januar 2008)

Habe es auch einmal anders getestet, aber das ging auch nicht...argh...

```
int i=0;
                            do{
                            
                            fgets(lager,400,Speicher);
                            if(strcmp(lager, ENTER)){i++;};
                            printf("%d. %s",i,lager);
                            
                            }while(fgets(lager,400,Speicher) != NULL);
```

Ist es so schwer Datein auszulesen?


----------



## XeoX (30. Januar 2008)

Nein schwer nicht, wenn du die Funktion kennst!
Versuch es mal so! Wenn fragen dann melden!


```
while (!feof(Speicher)){
   fgets(lager, /* Zeichen anzahl */ , Speicher);
   printf("%s", string);
  }
```


XeoX


----------



## hg197 (30. Januar 2008)

Danke dir, habe eben auch an der Umrechnung in Buchstaben gewerkelt, aber mir will die Umwandlung von Oktal in Buchstabe nicht gelingen...les ich das falsch ein? Ich lese die Zahlenkolonne mit nem string ein..


```
for(index=0; index< strlen(pswd);index++)
     {
                  kod[index]=(char) pswd[index];
                  }
                  strcpy(pswd,kod);
```

kod und pswd sind chars mit der Länge [400]. index ein Integer


----------



## XeoX (30. Januar 2008)

Du codierst dort nichts um! Wenn pswd der Eingeselesende string ist schreibst du nur die Zahlen eine nach der anderen in den neuen String!

Du musst wenn es sich um eine Zahl handelt musst du es entweder nicht als string einlesen oder mit der Funktion "atoi" aus stdlib.h die Zeichen in ein Integerwert umwandeln!

XeoX


----------



## hg197 (30. Januar 2008)

Ich habe leider mit der Schleife, die die Daten einlesen soll, immernoch Probleme. Es wird ordentlich kompiliert aber wenn die Schleife arbeiten soll, dann geht das Programm einfach aus. Wird da was falsch eingezogen? Die Datei existiert auf jedenfall.


----------



## XeoX (30. Januar 2008)

Stell doch mal den betreffenden Teil ins Forum, dann kann ich sehen wie du das machst, vielleicht auch mit dem Filepointer!

oder eine PN!

XeoX


----------



## hg197 (30. Januar 2008)

Also der Abschnitt sieht wie folgt aus:


```
FILE *Speicher;
...
...
Speicher=fopen("0002.mem","r");
int i=0;
while (!feof(Speicher))
{
fgets(lager, 400 , Speicher);
if(strcmp(lager, ENTER)== strcmp(lager, ENTER)){i++; continue;}
printf("%d. %s",i,lager);
}
```

Ich kann die Datei öffnen und lesen was drin steht, aber das Programm nicht.


----------

