Zum Inhalt springen

Sonderzeichen und Umlaut Prüfung mit String


Gentleman81

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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---

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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,

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...