ANSI in ASCII umwandeln
-
Hallo zusammen,
ich habe ein kleines problem bei dem ich jetzt nach 2 stunden völlig erfolgloser recherche einfach überhaupt nicht weitergekommen bin. und zwar muss ich eine Zeichenfolge die in ANSI kodiert ist in ASCII umwandeln und dann ausgeben.
bevor ich jetzt lange erkläre wie das so aussieht stelle ich mal den code online:
#include <stdio.h> /* INCOMPLETE function to decode the destination storage */ char* decode(char*,int,int,int) { /*EDIT: getchar ist von mir noch drinnen gestanden*/ return array; } int main() { //Declares an array with two rows each 100 characters long char destinationStorage[2][100]; //Fills the two lines of the array with the different ANSI coded characters //sprintf works like printf. It writes the result not on console but in a given array. sprintf(destinationStorage[0],"Bssjwbm;!Qmbofu;Sjtb!Dppse;59023O!27033P!Ujnf!23;42!Ebuf;!15/17/3199"); sprintf(destinationStorage[1],"Eftujobujpo;!"); //Start of exercise... return 0; }
in der anleitung steht, dass ich vom ascii code jedes zeichens jeweils den wert 1 abziehen muss, damit die zeichenfolge anschließend richtig ausgegeben wird.
das ganze muss ich oben in der decode funktion realisieren vermute ich mal.bin kurz vorm verzweifeln weil ich einfach null plan hab wie das jetzt funktionieren soll. der einzige hinweise, der mir dazu gegeben wurd ist, dass "ich mich jetzt ja mit pointern und arrays auskenne" ... das hilft mir aber beim besten willen nicht.
also hoffentlich kann mir jemand von euch helfen!!
-
Also erstmal http://www.torsten-horn.de/techdocs/ascii.htm ankucken.
Irgendwie sieht es so aus als wären die Tabellen ziemlich gleich.Wollte man wirklich jedes Zeichen um eins verringern könnte man sowas wie
for (char *s = "meinstring";s;s++)*s++;
schreiben. Keine Ahnung ob das tut was du willst.
-
danke erstmal für die antwort!
also soweit ich das weiß, sind die so ziemlich genau gleich, nur eben, dass sie um einen wert versetzt sind - deshalb muss ich auch von jedem zeichen 1 abziehen.
Ich muss das dekodieren ja in dieser funktion (siehe unten) realisieren, deshalb befürchte ich, dass mir dein code hier nicht weiterhilft?!
ich verstehe generell nicht so ganz was ich da machen soll mit dem (char*,int,int,int) ... kenn mich genau null auschar* decode(char*,int,int,int) { return array; }
-
nwp2 schrieb:
Wollte man wirklich jedes Zeichen um eins verringern könnte man sowas wie
for (char *s = "meinstring";s;s++)*s++;
schreiben. Keine Ahnung ob das tut was du willst.
Wenn er eine Endlosschleife haben will, dann tut es das.
Aber dann verpasst er das Datum der Ankunft: 04.06.2088bflow schrieb:
ich verstehe generell nicht so ganz was ich da machen soll mit dem (char*,int,int,int) ... kenn mich genau null aus
char* decode(char*,int,int,int) { return array; }
Hi,
wozu die ganzen Integerparameter gut sein sollen, weiß ich auch nicht.
Aber du kannst so vorgehen:
Nen Zeiger auf dein Array richten:char* s = &destinationStorage[0];
Und denne die Zeichenkette bis zur abschließenden Null durchlaufen und dabei jeden Wert um eins verringern:
while(*s) (*s)--, s++;
Dann das Ergebnis bestaunen:
puts(destinationStorage[0]);
Gruß,
B.B.
-
Ja, da fehlt ein *. Gibt nen Segfault, keine Endlosschleife.
for (char *s = "meinstring";*s;s++)*s++;
Das sollte man dann in eine Funktion schreiben und statt "meinstring" den eigentlichen String benutzen.
-
nwp2 schrieb:
Gibt nen Segfault, keine Endlosschleife.
Das guck dir ruhig noch einmal in Ruhe an
-
Dacht ich guck mal, ob ich rausfinde wer solche tollen Aufgaben stellt und was finde ich:
http://forum.fachinformatiker.de/c-c/133554-ansi-ascii-umwandeln.html
Muss ja ein dringender Fall sein.
@bflow:
Hast noch fast 80 Jahre Zeit, keine Panik.
-
Big Brother schrieb:
nwp2 schrieb:
Wollte man wirklich jedes Zeichen um eins verringern könnte man sowas wie
for (char *s = "meinstring";s;s++)*s++;
schreiben. Keine Ahnung ob das tut was du willst.
Wenn er eine Endlosschleife haben will, dann tut es das.
Aber dann verpasst er das Datum der Ankunft: 04.06.2088bflow schrieb:
ich verstehe generell nicht so ganz was ich da machen soll mit dem (char*,int,int,int) ... kenn mich genau null aus
char* decode(char*,int,int,int) { return array; }
Hi,
wozu die ganzen Integerparameter gut sein sollen, weiß ich auch nicht.
Aber du kannst so vorgehen:
Nen Zeiger auf dein Array richten:char* s = &destinationStorage[0];
Und denne die Zeichenkette bis zur abschließenden Null durchlaufen und dabei jeden Wert um eins verringern:
while(*s) (*s)--, s++;
Dann das Ergebnis bestaunen:
puts(destinationStorage[0]);
Gruß,
B.B.danke
aber entweder bin ich zu müde oder einfach schon zu genervt, dass ich es noch nicht ganz verstehen will... das fehlende know how kommt dann auch noch dazu
while(*s) (*s)--, s++;
die schreibweise ist mir noch nicht vertraut... bei einer while schleife kommt doch die bedingung in die klammer direkt nach dem while... könntest du mir das kurz erklären oder zeigen wie ich es anders anschreiben kann?
puts(destinationStorage[0]);
habe ich gerade nachgelsen was es ist.
(ich bin gerade komplett am durchdrehen weil die gesamte aufgabe einfach 10lvls über meinem ist... war aber immer in der vorlesung - das nervt wirklich!)
wie mach ich das jetzt mit der funktion? ich check leider wirklich überhaupt nicht wie das funktionieren soll -.-
habs mal probiert aber komme einfach hinten und vorne nicht zusammen -.- ich weiß dass vermutlich einfach alles falsch ist aber vielleicht könntest du/könntet ihr mir da nochmal aushelfen!char* decode(char*) //ich muss ja hier in dieser funktion dekodieren - wie soll das gehen?! { char array; char* s = &destinationStorage[0]; while(*s) (*s)--, s++; array = destinationStorage[0]; return array; } int main() { //Declares an array with two rows each 100 characters long char* storage1; char destinationStorage[2][100]; //Fills the two lines of the array with the different ANSI coded characters //sprintf works like printf. It writes the result not on console but in a given array. sprintf(destinationStorage[0],"Bssjwbm;!Qmbofu;Sjtb!Dppse;59023O!27033P!Ujnf!23;42!Ebuf;!15/17/3199"); sprintf(destinationStorage[1],"Eftujobujpo;!"); //Start of exercise... void *p1; p1 = &destinationStorage[0]; storage1 = decode (*p1); //k.A. ob man das so überhaupt machen kann printf("%s\n", storage1);
-
Big Brother schrieb:
Dacht ich guck mal, ob ich rausfinde wer solche tollen Aufgaben stellt und was finde ich:
http://forum.fachinformatiker.de/c-c/133554-ansi-ascii-umwandeln.html
Muss ja ein dringender Fall sein.
@bflow:
Hast noch fast 80 Jahre Zeit, keine Panik.
haha
tja 80 jahre leider nicht mehr. wohl eher bis um 18:00 morgen
und mich stressts gerade komplett her weil mir nach der aufgabe noch ca 2/3 von der gesamten fehlen und da dann so spielerein wie 4-gewinnt usw auf mich zukommen und soweit ich das gesehen habe werde ich mir da um nichts leichter tun.
und mit 2 studien + arbeit ist dann unter der woche einfach nicht mehr sehr viel mit aufgabe machen und dann wirds halt leider immer sehr stressig am wochendenaja aber vielen dank schon mal dass du mir hilfst
-
Big Brother schrieb:
Nen Zeiger auf dein Array richten: char* s = &destinationStorage[0];
Schnell wieder vergessen, das muss hier
char* s = destinationStorage[0];
heißen.
Ich habe ein paar kommentierte Möglichkeiten aufgeschreiben, wie man die decode Funktion machen kann. Vllt. hilft es ja:
/* char* s = &destinationStorage[0]; Definition des Zeigers s, der an den Anfang der Zeichenkette zeigt. while (*s) Solange der Wert des Zeichens, auf den s zeigt, nicht gleich 0 ist. Mann kann dafür auch while ( *s != '\0' ) schreiben. (*s)-- Dekrementiere den Wert, auf den s zeigt um 1 s++ Inkrementiere die Adresse um 1, zeige also auf das nächste Zeichen. */ char* decode1 ( char* a ) { char *s = a; if ( s != NULL ) while (*s) (*s)--, s++; return a; // Den Anfang der veränderten Zeichenkette zurückgeben. } // gleich wie decode1, anders geschrieben. char* decode2 ( char* a ) { char *s = a; if ( s != NULL ) { while ( *s != '\0' ) { (*s)--; s++; } } return a; // Den Anfang der veränderten Zeichenkette zurückgeben. } // Macht das gleiche wie decode1 und decode2, Zugriff über Index. char* decode3 ( char* a ) { int i = 0; if ( a == NULL ) return a; while ( a[i] != '\0' ) { a[i]--; i++; } return a; // Den Anfang der veränderten Zeichenkette zurückgeben. } int main() { char destinationStorage[3][100]; sprintf ( destinationStorage[0], "Bssjwbm;!Qmbofu;Sjtb!Dppse;59023O!27033P!Ujnf!23;42!Ebuf;!15/17/3199" ); sprintf ( destinationStorage[1], "Eftujobujpo;!" ); sprintf ( destinationStorage[2], "Cjh!Cspuifs" ); printf ( "%s\n", decode1 ( destinationStorage[0] )); printf ( "%s\n", decode2 ( destinationStorage[1] )); printf ( "%s\n", decode3 ( destinationStorage[2] )); return 0; }
Gruß,
B.B.
-
vielen vielen vielen Dank!!! du bist der hammer!
jetzt versteh ich das endlich
war wirklich schon am verzweifeln!und nochmals danke für die mühe!