Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!

Geschrieben

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

}

Geschrieben
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

Geschrieben

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

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

Geschrieben

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]

Geschrieben

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

}

Geschrieben

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]

Geschrieben

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

Geschrieben

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.

Geschrieben

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?

Geschrieben

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.

Geschrieben

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,

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

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