Gentleman81 Geschrieben 24. März 2003 Geschrieben 24. März 2003 Hallo Leute! Ich möchte ein string mit "gets" einlesen, sagen wir "char cEingabe[50]" Nach dem Einlesen möchte ich prüfen ob Sonderzeichen, oder ä, ö, ü in der Eingabe vorkommen, wenn das der Fall, soll eine Fehlermeldung ausgeben werden, ansonsten soll das Programm normal weiter laufen. Wie stelle ich das mit der Prüfung an? Danke schon ma im Voraus! Zitieren
Guybrush Threepwood Geschrieben 24. März 2003 Geschrieben 24. März 2003 Hi, du könntest zum einen selber ein Schleife schreiben, die den String Zeichen für Zeichen nach Sonderzeichen absucht, oder du benutzt eine Funktion wie z.B. strchr() die das erste Vorkommen eines Zeichens in einem String angibt. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Noch ein Tipp zur Sicherheit: gets ist böse. Du kannst nie vor einem Pufferüberlauf sicher sein. Nimm fgets, da kannst du eine Obergrenze angeben. Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Erstmal danke für die schnelle Antwort! Also könnte der Quellcode so aussehen??(hab hier leider keinen Compiler zum Testen): #include <stdio.h> #include <string.h> int main() { char cEingabe[50]; printf("Bitte geben Sie einen Namen ein: "); gets(cEingabe); if((strchr(cEingabe, 'ä') == 0) || (strchr(cEingabe, 'ü')== 0) || (strchr(cEingabe, 'ö')== 0) ); printf("\Der Name darf keine Umlaute enthalten!\n"); else ---Programmablauf--- } Zitieren
Guybrush Threepwood Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by Klotzkopp Noch ein Tipp zur Sicherheit: gets ist böse. Du kannst nie vor einem Pufferüberlauf sicher sein. Nimm fgets, da kannst du eine Obergrenze angeben. Noch eine kleine Anmerkung falls du dich über fgets() wunderst, der FILE Pointer den du angeben mußt um von der Tastatur zu lesen ist stdin. Bei strchr mußt du auf ungleich NULL prüfen, weil wenn die Funktion NULL zurückgibt hat sie kein entsprechendes Zeichen gefunden. Gruß Guybrush Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 ungleich 0? Er soll ja Prüfen ob Umlaute drinne sind, wenn ja, die Ausgabe "der Name darf keine Umlaute enthalten" ansonsten (else) programmablauf Oder hab ich jetzt einen Denk Fehler? Ist die Schreibweise im Quelltext mit 'ä' usw. korrekt oder muss das anders lauten? wie würde die Prüfung mit ;:-=\/ß? usw. gehen? Danke für die wirklich schnelle Hilfe!!:marine Zitieren
Guybrush Threepwood Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by Gentleman81 ungleich 0? Er soll ja Prüfen ob Umlaute drinne sind, wenn ja, die Ausgabe "der Name darf keine Umlaute enthalten" ansonsten (else) programmablauf Oder hab ich jetzt einen Denk Fehler? strchr() gibt immer dann eine Null zurück wenn kein entsprechendes Zeichen in dem String gefunden wurde. Also mußt du entweder abfragen das ein Zeichen gefunden wurde ( ungleich Null), oder deine Fehlermeldung in den else Block legen. Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Jo...sorry, verlesen! Ist klar! Vielen Dank noch mal! prüft man "\" so: if(strchr(cEingabe, '\\') == 0) ? Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Es ist wahrscheinlich einfacher, wenn du alle ungültigen Zeichen in einen String packst, und danach jedes Zeichen im Eingabestring daraufhin untersuchst, ob es im String der ungültigen Zeichen auftaucht: const char* ungueltig = "äöüÄÖÜß;:-=\\/"; for( char* p = cEingabe; *p; ++p ) { if( strchr( ungueltig, *p ) ) { // ungültiges Zeichen gefunden // Fehlermeldung etc break; } } [/CODE] Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Danke, das mit der Variable ist eine gute Idee! Jetzt hab ich nur noch ein Problem: wenn ich den Namen über "gets" einlesen (was voaussetzung ist) und einen Namen mit Umlaut eingebe, erkennt er den Umlaut nicht und arbeitet das Programm ab! Die Sonderzeichen funktionieren! Wenn ich cName[50]= "standartmässig"; zuweise gehts auch, nur über "gets" net....habt Ihr ne Lösung wie es auch über "gets" klappen könnte?? Hier der Quellcode { const char* ungueltig = "äöüÄÖÜß;:-=\\/"; char cName[50]; char Pfad[12] = "C:\\Daten\\"; char Datei[5] = ".DAT"; char Gesamt[80]; printf("\n Bitte geben sie den Dateinamen ein: "); gets (cName); /*liest ersten String ein*/ for( char* p = cName; *p; ++p ) { if( strchr( ungueltig, *p ) ) { printf("\nDer Name darf keine Umlaute enthalten!"); break; } } strcpy (Gesamt, Pfad); strcat (Gesamt, cName); strcat (Gesamt, Datei); FILE *text; text= fopen(Gesamt,"w+"); fprintf(text,"\tNr.\t\tMesswert\n"); fclose(text); } Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Das break bedeutet nur, dass die Schleife vorzeitig verlassen wird - es macht ja keinen Sinn, nach weiteren ungültigen Zeichen zu suchen. Das Programm läuft danach normal weiter. Du musst also nach der Schleife prüfen, was weiter geschehen soll. Das kann man machen, indem man das Auftreten des Fehlerfalls in einer bool-Variablen ablegt: bool nameInOrdnung = true; for( char* p = cName; *p; ++p ) { if( strchr( ungueltig, *p ) ) { printf("\nDer Name darf keine Umlaute enthalten!"); nameInOrdnung = false; break; } } if( nameInOrdnung ) { // weitere Verarbeitung...[/CODE] Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Mit dem oben genannten Quellcode funktionirts ja wunderbar, aber müsste er in der Schleife nicht einen Umlaut finden, wenn ich über "gets" z.B. "standartmässig" eingebe? Macht er nicht! Bei Sonderzeichen gehts: /\;-usw. findet er und gibt auch die Fehlermeldung aus Wenn ich cName[50] im Quellcode "standartmässig" zuweise gehts ja auch, er gibt die Fehlermeldung aus...warum über "gets" net?? Danke für deine Geduld:bimei Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Ich vermute mal, dass dein Quellcode in ANSI codiert ist (hängt vom Editor ab), und die Eingabe in ASCII erfolgt. Und da ist der Code für 'ä' leider nicht derselbe. Du kannst das ausprobieren, indem du mal den String mit den ungültigen Zeichen ausgeben lässt. Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Volltreffer! Bei Ausgabe des Strings gibt er bis auf die Sonderzeichen nur Schrott raus! Also die Situation ist die, wir "machen" in der Schule Ansi C und sollen jetzt als kleine Hausaufgabe ein Programm schreiben, das mit "gets" Strings einliest, es sollen aber keine Umlaute und Sonderzeichen unterstützt werden...hast du eine Idee? Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Ich weiß nicht, ob es in ANSI-C eine Konvertierungsfunktion gibt. Du könntest aber natürlich auch die ASCII-Codes in deinen String eintragen: const char* ungueltig = "\x84\x94\x81\x8e\x99\x9a\xe1;:-=\\/"; Oder dreh das ganze um und prüfe mit einem String, der alle gültigen Zeichen enthält. Zitieren
Gentleman81 Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Super Idee mit den ASCII-Codes in deinen String eintragen! damit funktionierts! Denke das kann ich so lassen! kannst du mir nur noch mal helfen die Schleif in Ansi C umzuwandeln: for( char* p = cName; *p; ++p ) { if( strchr( ungueltig, *p ) ) { printf("\nDer Name darf keine Umlaute oder Sonderzeichen enthalten!"); break;} } anstatt ++p einfach p=p+1 oder? was macht char* noch gleich? p ist denk ich mal ein zeiger, d.h. p zeigt auf cName, aber welcher wert ist in der Mitte der Schleife? normal sieht ja ne for Schleife so aus : for(i=0; i<10(oder Variable); i=i+1;){.....} Das wird dann meien letzte Frage sein!:bimei Ich danke Dir und Guybrush für Eure Mühe! Wirklich Klasse Hilfe! Gruss, Zitieren
Klotzkopp Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by Gentleman81 anstatt ++p einfach p=p+1 oder?Was hast du gegen ++p? ANSI-C ist das auf jeden Fall. was macht char* noch gleich? p ist denk ich mal ein zeiger, d.h. p zeigt auf cName, aber welcher wert ist in der Mitte der Schleife?p ist ein Zeiger auf char, der am Anfang der Schleife auf das erste Element von cEingabe gesetzt wird. Der mittlere Ausdruck in der for-Klammer ist die Abbruchbedingung. Die Schleife endet, wenn dieser Ausdruck Null (oder false) wird. *p bedeutet hier einfach das Zeichen, auf das p gerade zeigt. Hier wird ausgenutzt, dass das Stringende durch ein Nullzeichen gekennzeichnet ist. Am Ende des Strings wird *p also Null, und die Schleife wird beendet. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.