E-Mailabfrage



  • Hallo ich mal wieder,

    ich hab ein Code geschrieben der ne Email abfragen soll. aber seht selbst:

    /*
    7. Realisieren Sie ein C-Programm, das eine E-Mail-Addresse abfragt.
       Es soll überprüfen, ob es sich tatsächlich um eine E-Mail-Addresse handelt.
       Es soll ein "@" Zeichen vorkommen, danach der Domain-Name.
       Beispiele für gültige Domains: => domain.com || domain.de || domain.org
    */
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main(void)
    {
    	char a[] ="domain.com";
    	char b[] ="domain.de";
    	char c[] ="domain.org";
    	char email[100];
    
    	printf("Bitte geben sie Ihre E-Mailadresse ein: \n");
    	scanf("%c", &email[0]);
    
    	if(strchr(email ,'@'))	//prüft auf @ zeichen
    		{
    		if(strstr(email, a))	// prüft auf domain.com
    			{
      	    printf("E-Mailadresse ist korrekt!\n");
    			}
    		else if(strstr(email, b))	// prüft auf domain.de
    			{
      	    printf("E-Mailadresse ist korrekt!\n");
    			}
    		else if(strstr(email, c))	// prüft auf domain.org
    			{
        	  printf("E-Mailadresse ist korrekt!\n");
    			}
    		else
    			{
    				printf("E-Mailadresse ist nicht gültig!\n");
    			}
    		}
    
    	else
    		{
    			printf("E-Mailadresse ist nicht gültig!\n");
    		}
    
    	return EXIT_SUCCESS;
    }
    

    Das blöde an dem Code ist, er sagt mir immer E-Mailadresse ist nicht gültig!

    Jetzt scheint er ja meine Vergleiche nicht zu nehmen oder? Hab ich da ein Syntaxfehler drin?

    Ich hatte das Programm mal auseinander genommen und das funktionierte zumindest mal die überprüfung nach dem @.

    Könnte mir jeman dhelfen und vllt erklären warum das nicht geht? 😕



  • Was soll das?

    Wir sind ja alle gerne Bereit Zeit für Dich zu opfern. Und vielleicht hat Dich auch nur noch niemand darauf hingewiesen, dass Du bevor Du hier postest eventuell mal schauen solltest, wie der interne Zustand Deines Programms ist.
    Bleibst Du beim Programmieren wirst Du später einen Debugger dazu nehmen. Aber momentan reichen ein paar printf() s, die Du überall einbaust um zu schauen, was passiert.

    Z.B.: Was ist der Inhalt Deines char arrays email in Zeile 22?



  • dankeschön ich habe den fehler gefunden. Schade das du so reagierst. Werde in zukunft den Debugger nutzen.

    Also danke nochmals..



  • Du liest genau ein (in Ziffern 1) Zeichen ein.
    Das kann keine gültige E-Mail-Adresse sein.



  • Ach, und ....
    "domain.de@" ist bei dir auch gültig.



  • Ha, okay, ja das mit dem %c hab ich gefunden..
    danke.

    Jetzt muss ich erstmal überlegen wie das mit dem letzten problem ist was du sagst. Vielen Dank für den hinweis!

    Grüße



  • entschuldigt das ich nochmals frage,

    ist es möglich bzw sinnvoll, da ich ja wie dirkb geschrieben hat, nicht überprüfe an welcher stelle das @ kommt, den string einfach zu teilen und zu sagen: prüfe den string nach dem @.

    ich dachte mir da sgeht vllt mit strtok.

    ist das sinnvoll?

    Danke für die antwort.

    // Edit

    okay.. das geht nicht. entschuldigt... 👎



  • Kannst Du nicht ein "Rezept" erstellen, dass alle email-Adressen erschlägt?! Und das dann implementieren?

    Mit "Rezept" meine ich ein Gesetz, eine Formel, die gültige email-Adressen beschreibt:

    Z.B.:
    "Eine emailaddresse fängt an mit einem Buchstaben oder einer Zahl, gefolgt von weiteren Buchstaben, Zahlen oder Unterstrichen. Dann ein '@' zeichen..."

    Muss ja nicht perfekt sein. Aber franz_xaver@muenchen.de , oder hasi98@example.com sollten schon als valide eingestuft werden.

    Übrigens macht es sehr viel mehr Spass, über solche vertrackten Probleme zu lesen und zu schreiben als über den Unterschied von "%c" und "%s" in scanf() Formatstrings. 🙂



  • Ja wie gesagt, ich bin totaler anfänger, da war das mit dem %c und %s mir nicht so ersichtlich.

    tut mir leid, ich weiß ich langweile euch da brutal mit. Aber ich sitz hier und suche mir möglichkeiten zusammen das umzusetzen. jetzt versuch ich grad nen debugger einzurichten.

    Viel weiter bin ich noch nicht. Der kopf raucht. Und wenn ich überlege das sind hier kindergartenprogramme.. 😞
    Ich hab mir meine zukünftigen AUfgaben angeschaut, da werde ich euch sicher noch viel öfter brauchen.

    Grüße



  • moses030 schrieb:

    ich dachte mir da sgeht vllt mit strtok.

    Ja, würde gehen, a b e r ...
    ... strtok zerstört den Originalstring, weil es an die Stellen der Trennzeichen ein '\0' setzt. Zudem ist es nicht reentrant²

    Schau dir mal die Funktionen aus ctype.h an: http://www.cplusplus.com/reference/cctype/
    Oder schau dir nochmal die Funktionen aus string.h an.

    ²du kannst es nicht gleichzeitig mit verschiedenen Strings nutzen.



  • Was dir fehlt ist der Überblick über deine Aufgabe.
    Zerlege deine Aufgabenstellung ich fachlich zusammengehörende Teile,
    mache dir Gedanken, welche Daten(typen) die einzelnen Programmteile benötigen und schreibe für jeden Teil jeweils eine (oder mehrere) Funktionen.
    Bei dir z.B. wären das
    - Benutzereingabe einlesen
    - Analyse der Eingabe
    - Ausgabe Ergebnis (Treffer oder nicht)
    Das nennt man auch Programmdesign.

    Schreibe zuerst mal die rohen Funktionen ohne Inhalt (aber mit passenden Parametern), ergänze danach die Funktionen mit Code.
    Das nennt man auch Top-Down Entwurf.

    Ersetze die interaktive Benutzereingabe testweise durch eine möglichst hohe Anzahl von möglichen Strings mit ihrem Ergebnis und teste (in einer Schleife über alle Testkandidaten) solange deinen Code, bis alle Tests OK sind.
    Das nennt man auch testgetriebene Entwicklung (TDD).

    Die Prinzipien kannst du bei allen Aufgabenstellungen anwenden, ohne dich bei konkreten Implementierungen aufzuhalten.



  • Benutze den Rückgabewert von strchr. Dieser gibt dir einen Zeiger auf das erste Vorkommen des Zeichens an bzw., wenn nicht gefunden einen Nullzeiger.

    char * PosZeichenInString
    PosZeichenInString = strchr(email, '@');
    If (PosZeichenInSrtring != NULL)    ' @ wurde gefunden
       PosZeichenInString++;    'Adresse hinter @ setzen
      if (strstr(PosZeichenInString, a)) ...
    


  • Hallo,

    danke für die vielen Tipps und Hilfen.

    Ich saß jetzt die halbe Nacht daran. Ich habe viele varianten ausprobiert. Es kamen fast alle auf das gleiche raus. Sie klappten fast, nur etwas fehlt.

    AUch der Typ von dir Bonni435 war sehr hilfreich. Hat natürlich funktioniert.
    Nun überlege ich, wie ich ausschließen kann, das vor dem @ nicht nichts steht.

    Geht es, das ich bevor ich den zeiger inkrementiere, den Zeiger dekrementiere und prüfe ob sich ein x belieber char davor befindet? also das geht bestimmt, nur ist es dann auch so einfach wieder den zeiger auf die stelle nach dem @ zu setzen? also mal Beispielhaft:

    [code="c"]
    d = strchr(email ,'@'); //prüft auf @ zeichen
    if (d != NULL)

    d--;

    if strchr(d, const char)
    {
    d+2;
    if strstr(d, a)
    {
    printf(".........")

    usw....

    [code="cpp"]

    ginge das?

    weil ich muss ja nur prüfen ob irgendein buchstabe bzw irgendeine zahl vor @ da ist. zb 8@domain.de wäre ja ne emailadresse.

    werde es jetzt ausprobieren, vllt ist ja jemand mit schreiben schneller und kann mir gleich sagen nein oder ja bevor ich hier wieder stunde sitze obwohl es eh nicht funktionieren kann 🙂

    danke schonmal



  • Also ich glaube ich habs!

    Es hat funktioniert wie ich es fragte.
    Hier mal der Code:

    Bitte berichtigt mich falls ich was falsch hab oder es einfach machen könnte. Wäre nett.

    /*
    7. Realisieren Sie ein C-Programm, das eine E-Mail-Addresse abfragt.
       Es soll überprüfen, ob es sich tatsächlich um eine E-Mail-Addresse handelt.
       Es soll ein "@" Zeichen vorkommen, danach der Domain-Name.
       Beispiele für gültige Domains: => domain.com || domain.de || domain.org
    */
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    int main(void)
    {
    	char a[] ="domain.com\0";
    	char b[] ="domain.de\0";
    	char c[] ="domain.org\0";
    	char email[100];
    	char *d;
      const char *erlaubt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-1234567890";
    
    	printf("Bitte geben sie Ihre E-Mailadresse ein: \n");
    	scanf("%s", &email[0]);
    
    	d = strchr(email ,'@');	//prüft auf @ zeichen
    		if (d != NULL)
    			{
    				d--;
    
    			if(strchr(erlaubt, *d))
    				{
    					d+2;
    
    					if(strstr(d, a))	// prüft auf domain.com
    						{
      		 		   printf("E-Mailadresse ist korrekt!\n");
    						}
    					else if(strstr(d, b))	// prüft auf domain.de
    						{
      			    	printf("E-Mailadresse ist korrekt!\n");
    						}
    					else if(strstr(d, c))	// prüft auf domain.org
    						{
        				  printf("E-Mailadresse ist korrekt!\n");
    						}
    					else
    						{
    							printf("E-Mailadresse ist nicht gültig!\n");
    						}
    				}
    			}
    
    	else
    		{
    			printf("E-Mailadresse ist nicht gültig!\n");
    		}
    
    	return EXIT_SUCCESS;
    }
    

    Danke an alle die mir helfen wollten 👍



  • domain.com, domain.de und domain.org sind Beispiel für gültige Domains, keine vollständige Liste.

    \0 am Ende eines Zeichenkettenliterals ist unnötig.

    Diese Zeile bewirkt nichts:

    d+2;
    

    Dein Programm akzeptiert foo@@@domain.de@@@

    uvm.



  • Man kann mit Pointern auch rechnen.

    size_t len_name;
    
        d = strchr(email ,'@'); //prüft auf @ zeichen
        if (d != NULL) {
    
          len_name = email-d;  // Laenge vom Namen aus den Pointern. 
    
          if (len_name > 0) {  // sind da überhaupt Zeichen?
            if (strspn(strtext,erlaubt) == len_name) {  // alles gueltige Zeichen?
            ....
    

    Wobei eine Funktion da einfacher ist, da du sie jederzeit verlassen kannst:

    int ist_gueltige_EMail_Adresse {const char *email) {
    
       char *d;
    
       d = strchr(email ,'@'); //prüft auf @ zeichen
       if (d == NULL) 
         return 0;  // kein @
    
       if (strspn(d,"@") != 1)  // wieviel '@ sind denn da?
         return 0;              // mehr als 1 '@'
    
       len_name = email-d;  // Laenge vom Namen
       if (len_name == 0)   // sind da überhaupt Zeichen?
         return 0; 
    
       ....
    
       return 1;
    }
    

    Und so kannst du testen:

    char *testadressen[] = { "foo@@@domain.de@@@", 
                             "domain.de@", 
                             "I@me.com", 
                             "Du kannst hier jederzeit weiter Adressen (vor dem NULL) einfuegen", 
                             NULL};
    
    for(int i=0; testadressen[i] != NULL; i++} 
    { if (ist_gueltige_EMail_Adresse(testadressen[i]) != 0) 
        printf "Adresse %30s ist gueltig\n",testadressen[i];
      else
        printf "Adresse %30s ist ungueltig\n",testadressen[i];
    }
    

    ^Alles ungetestet^



  • Danke erstmal für eure Hinweise.

    Da denkt man man ist fertig... is doch be*******

    werd jetzt alles übern haufen schmeißen und neu anfangen.. nutz ja nix..

    ich poste mein fortschritte, vllt könnt ihr mir ja tipps geben.

    Danke 👍



  • Hallo ich mal wieder,

    hier erstmal meine FUnktion so wie dirkb es vorschlug :

    /*
    7. Realisieren Sie ein C-Programm, das eine E-Mail-Addresse abfragt.
       Es soll überprüfen, ob es sich tatsächlich um eine E-Mail-Addresse handelt.
       Es soll ein "@" Zeichen vorkommen, danach der Domain-Name.
       Beispiele für gültige Domains: => domain.com || domain.de || domain.org
    */
    
    #include<stdio.h>
    #include<string.h>
    
    int ueberpruefung(const char *email)
    {
    	char *p;
    	char vname;
    	char hname;
    	char endung;
    	const char *erlaubt ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-1234567890";
    
    	p =strchr(email, '[zeichen]');			//ein zeichen vorhanden?
    		if(d ==0)							// nein?
    			{
    				return 0;					// Ende!
    			}
    
    		if(strspn(p,"[zeichen]" !=1)		// Auf Zeichen prüfen. Mehr als 1 [zeichen]?
    			{
    				return 0;					// Ende!
    			}
    
    		vname =email-p;						// reduziere auf alles vor [zeichen]
    			if(name == 0)					// keine Zeichen da?
    				{
    					return 0;				// Ende!
    				}
    
    			if(name != 0)					// zeichen da?
    				{
    					if(strchr(erlaubt, name ==0)		// überhaupt erlaubte Zeichen? Nein?
    						{
    							return 0;				// Ende!
    						}
    				}
    

    Jetzt meine Frage: Ich muss ja noch abfragen ob nach dem @ Zeichen noch die gewünschten "Endungen" kommen. ALso eben domain.org/de/com && ich muss ja nich fragen ob nach den Endungen noch was kommt.

    Was wäre denn jetzt die sinnvollste möglichkeit? Ich müsste doch das alles nach dem @ einfach über strcmp vergleichen oder? Aber wie schaffe ich es, das alles nach dem @ als string erkannt wird?

    Könnte mir jemand helfen? Achso und wenn in dem jetzigen Code etwas falsch ist, bitte ich gern um Hinweise 🙂

    Vielen danke und schönes Wochenende euch.

    Grüße



  • Dein Code ist totaler Müll, das kompiliert noch nicht mal.
    Sei nicht so faul und gib dir mal Mühe.



  • Und schau nochmal was MFK geschrieben hat. Ich meine er hat Recht damit, dass die Aufgabenstellung eher vorsieht, dass du auf '.com', '.org' und '.de' prüfst,
    anstelle des gesamten Strings nach dem @. Da kann auch web.de oder c-plusplus.net stehen.

    Schau dir dazu mal strrchr an.
    http://www.c-howto.de/tutorial-strings-zeichenketten-stringfunktionen-suchen-strchr.html

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char email[] = "me@domain.org";
        char *ptr;
    
        ptr = strrchr(email, '.');
    
        if(strcmp(ptr, ".org") == 0 || strcmp(ptr, ".com") == 0 || strcmp(ptr, ".de") == 0)
            printf("Gueltig!\n");
        else 
            printf("Ungueltig!\n");
    
        return 0;
    }
    

Anmelden zum Antworten