Probleme mit Zeichenketten
-
Hallo liebe Programmierer,
Ich habe ein Problem mit einem Programm durch das Ich Veraenderungen an einer Zeichenkette vornehmen lassen möchte.
Hier die Standardversion:#include<stdio.h> #include<stdlib.h> #include "Diverses.h" //buchstabenarray---->string int main(void){ char text[]="Ein Herrfaellt vom Stuhl (Erich Kaestner) Es ist bekannt, dass Menschen, die im Sitzen einschlafen, vornueber sinken. Immer tiefer und tiefer. Wenn die Koerpernerven, die trotz des Schlafens munter bleiben, spueren, dass sich das Schwergewicht allzu sehr vom Stuhl entfernt, geben sie dem Kopf einen Ruck. 012345Er fliegt nach rueckwaerts, und das sogenannte Einnicken kann wieder von vorne beginnen. Wenn die Nerven aber den richtigen Augenblick versaeumen, purzelt der Schlaefer vom Stuhl.Alfredo Torres, einem braven Buerger von Buenos Aires, erging es so. Er schlief ein und fiel vom Stuhl. Waere ihm das zu Hause passiert, haette es niemand weiter erfahren, und die Oeffentlichkeit wuesste heute noch kein Wort ueber den Fall.Nun passierte die Sache aber leider Herrn Torres nicht zu Hause, sondern im Theater. Die Stuhlreihen waren schmal.Und nun interessiert sich eine ganze Stadt fuer die Angelegenheit. Herr Torres hat naemlich die Rechnung, die der Arzt sandte, keineswegs bezahlt, sondern dem Dramatiker geschickt, der an dem Malheur die Schuld traegt. Denn - argumentiert der Rechtsanwalt des Verletzten - waere das Theaterstueck amuesanter gewesen, waere Herr Torres nicht eingeschlafen. Waere er nicht eingeschlafen, waere er nicht vom Stuehlchen gefallen. Waere er nicht vom Stuehlchen gefallen, haette er sich nicht wehgetan. Also: er verletzte sich, weil das Stueck schlecht war. Der Fall liegt eigentlich klar. Aber nur fuer Herrn Torres und seinen Rechtsanwalt. Der Stueckeschreiber und dessen Rechtsanwalt sind natuerlich ganz anderer Ansicht. Da waehrend der Auffuehrung - wenn sie auch schlecht war - von zweitausend Besuchern nur ein einziger vom Stuhl fiel, scheint dieser Fall doch wohl mehr auf Kosten dieses Besuchers, als auf die des Stueckes gesetzt werden zu duerfen. Immerhin ist der Prozess noch im Gange. Wir wollen hoffen, dass Herr Torres mit seiner Klage abgewiesen wird. Denn wo kaemen wir hin, wenn es den Autoren so erschwert wuerde, langweilige Dramen auffuehren zu lassen?"; char kontrollfeld[000000000000000000000]; int i, veraenderungszaehler=0; anz_zeichen=strlen(text); printf("Bitte geben Sie ein Wort bis 20 Buchstaben ein :"); scanf("%s",buchstabenfeld); printf("Das eingegebene Wort ist %s\n\n",buchstabenfeld);//&buchstabenfeld[0];--->alternativ.... for(i=0;i<anz_zeichen;i++) { //**************************************Wortgröße festlegen*************************************************************************************** kontrollfeld[0]=text[i]; kontrollfeld[1]=text[i+1]; /*****************************************************************************************************************************************************/ //Veraenderungssektor : Hier muss das zu verandernde Wort definiert : if ( .....) und die zu erzeugende Veraenderung eingegeben werden. if(kontrollfeld[0]=='a'&&kontrollfeld[1]=='u'){buchstabenfeld[i]='e';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='A'&&kontrollfeld[1]=='u'){buchstabenfeld[i]='E';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='a'&&kontrollfeld[1]=='U'){buchstabenfeld[i]='e';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='A'&&kontrollfeld[1]=='U'){buchstabenfeld[i]='E';buchstabenfeld[i+1]='L',veraenderungszaehler+=1;} //.................... /******************************************************************************************************************************************************/ } printf("\n\nDer gewandelte Text lautet auf %s",text); printf("\n\nEs wurden %i Worte veraendert",veraenderungszaehler); //system("pause"); return 0; }
Wenn Ich auf dieses char array anstatt dieser Geschichte von Erich Kästner also dem Text ein anderes c Prgramm draufladen möchte kommt es zu Problemen mit der Formatierung. Der Editor erkennt nicht das es Text ist sondern stellt an einigen Stellen obwohl es innerhalb der Anführungszeichen steht die Formatierung für C Quelltext ein:
Bsp:#include<stdio.h> #include<stdlib.h> #include "Diverses.h" //buchstabenarray---->string int main(void){ char text[]=" // Dieses Programm zeigt auf wie gefährlich eine falsch programmierte // Eingabe von Benutzerdaten sein kann. #include <stdio.h> #include <strings.h> // Definieren eigener Konstanten true, false sowie Mapping bool zu char // damit man nicht extra Bibliotheken für diese eine Def. einbinden muss #define true 1 #define false 0 #define bool char // Da es im ANSI-C-Standard diese "Begriffe" nicht gibt, aber das Programm // besser lesbar machen, verwende ich diese. Das Problem liegt aber ein- // deutig nicht an dieser Stelle. // Das Programm liest einfach solange ein Passwort vom Benutzer ein // bis es "vermeintlich" korrekt eingegeben wurde. int main() { bool passwort_korrekt = false; // Speichert Status, ob Passwort korrekt eingegeben wurde char passwort[10]; // Speicherplatz reservieren für Passworteingabe while (! passwort_korrekt) { // solange PW nicht korrekt eingegeben wurde… printf("Bitte Passwort eingeben: "); scanf("%s", passwort); if (strcmp(passwort,"geheim") == 0) { // Wenn PW korrekt, dann Status ändern passwort_korrekt = true; } } // Hier wird erst weitergemacht, wenn Status das richtige PW signalisiert printf("Passwort korrekt\n"); return 0; } "; char kontrollfeld[000000000000000000000]; int i, veraenderungszaehler=0; anz_zeichen=strlen(text); printf("Bitte geben Sie ein Wort bis 20 Buchstaben ein :"); scanf("%s",buchstabenfeld); printf("Das eingegebene Wort ist %s\n\n",buchstabenfeld);//&buchstabenfeld[0];--->alternativ.... for(i=0;i<anz_zeichen;i++) { //**************************************Wortgröße festlegen*************************************************************************************** kontrollfeld[0]=text[i]; kontrollfeld[1]=text[i+1]; /*****************************************************************************************************************************************************/ //Veraenderungssektor : Hier muss das zu verandernde Wort definiert : if ( .....) und die zu erzeugende Veraenderung eingegeben werden. if(kontrollfeld[0]=='a'&&kontrollfeld[1]=='u'){buchstabenfeld[i]='e';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='A'&&kontrollfeld[1]=='u'){buchstabenfeld[i]='E';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='a'&&kontrollfeld[1]=='U'){buchstabenfeld[i]='e';buchstabenfeld[i+1]='i';veraenderungszaehler+=1;} if(kontrollfeld[0]=='A'&&kontrollfeld[1]=='U'){buchstabenfeld[i]='E';buchstabenfeld[i+1]='L',veraenderungszaehler+=1;} //.................... /******************************************************************************************************************************************************/ } printf("\n\nDer gewandelte Text lautet auf %s",text); printf("\n\nEs wurden %i Worte veraendert",veraenderungszaehler); //system("pause"); return 0; }
Gibt es einen Trick mit dem man das Verhindern kann oder muss Ich nach einer anderen Lösung zum Verändern von Wörtern in langen Quelltexten suchen.
Es ist im Prinzip egal wie Ich die Worte verändere, Ich wollte zu Übungszwecken
dieses mit einem C-Prgramm erledigen... ?
-
Es sind scheinbar die im Programm vorhandenen Anführungszeichen, die das Problem auslösen,... gibt es einen Weg ohne diese einzeln zu entfernen etc... ?
-
Zeile 8 ist totaler Müll, du definierst ein Array der Größe 0.
Stringliterale sind begrenzt auf 509 bzw. 4095 chars.
Wie ist buchstabenfeld definiert?
Stringliterale dürfen kein ungeschütztes '\"' char enthalten, so wie du es machst.
Beschreibe mal in einem vernünftigen Satz, was dein Programm überhaupt machen soll, das ist aus deinem Geschreibsel nicht zu entnehmen.
-
Wutz schrieb:
Stringliterale sind begrenzt auf 509 bzw. 4095 chars.
Jain.
Das ist die Länge die jeder standardkonforme Compiler mindestens unterstützen muss.
Ein Compiler darf aber gerne viel viel längere String-Literals unterstützen - und viele tun das auch.