E-Mailabfrage



  • 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;
    }
    


  • moses030 schrieb:

    Aber wie schaffe ich es, das alles nach dem @ als string erkannt wird?

    Indem du die Adresse nach dem @ an strcmp übergibst.

    Die Adresse von dem @ hast du in p (oder meintest du d) gespeichert. Dann hat das Zeichen dahinter die Adresse p+1.
    Wenn es nach dem @ kein ZEichen mehr gibt, zeigt p+1 auf \0, was dem Leerstring entspricht.

    Du solltest NULL von 0 unterscheiden. NULL nimmt man bei Adressen.
    Das macht das lesen einfacher.



  • Natürlich kompiliert der nicht du kasperl 🙂

    Ist ja auch bei weitem noch nicht fertig, da ich mir den rat der vorherigen einträge zu herzen genommen habe und einfach erstmal nen grundgerüst ohne funktionsfähigen code schreibe einfach nur um mir ne übersich zu schaffen.

    Hatte ich aber geschrieben, vllt solltest du erstmal die vorherigen einträge lesen.

    Danke dirk das beantwortet super meine frage 🙂
    Jetzt wollt ich nochmal fragen, wenn ich p+1 übergebe, nimmt er dann alle chars die dahinter kommen (also den string) oder nimmt er nur die stelle die hinter p+1 (also hinter dem @ zeichen) steht?

    Also vergleicht er den restlichen string mit den vorgegebenen strings?

    dankeschön 👍



  • Guten Abend,

    also ich bin jetzt etwas spezifischer geworden. Hab den Code soweit fertig. Nur ich steh mal wieder von einem Problem....

    Ich hatte schonmal ein Threat geschrieben bzgl einer Zeichenabfrage und ob die Gültig ist. Der Code lautet wie folgt:

    #include <stdio.h>
    #include <string.h>
    
    enum { N = 5 };
    
    int main()
    {
        const char *erlaubt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-";
        char eingabe[100], *x = eingabe;
        char ergebnis[N + 1] = { 0 }, *y = ergebnis;
        int a = 0;
    
        fgets(eingabe, 100, stdin); /* String inkl. Leerzeichen lesen */
    
        while (a < N && *x != '\0') /* bis Stringende zeichenweise auswerten, aber bis max. 5x */
        {
            if (strchr(erlaubt, *x)) /* ist das aktuelle Zeichen erlaubt? */
            {
                a++;       /* Trefferzähler erhöhen */
                *y++ = *x; /* erlaubtes Zeichen in ergebnis anfügen */
            }
            ++x;
        }
    
        puts(ergebnis);
        return 0;
    }
    

    Der Beitrag war von Wutz. Hat echt super funktioniert, danke dir nochmal wutz!! 👍

    Nun habe ich folgenden Code für das aktuelle Programm:

    /*
    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 main(void)
    {
    	char email[100];
    	char vname, *p3=&vname; 
    	char *p1;
    	char *p2;
    	const char *erlaubt ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    
    	printf("Bitte geben Sie eine E-Mailadresse ein: \n");
    	scanf("%s", &email[0]);
    
    	p1 =strchr(email, '@');			//ein @ vorhanden?
    		if(p1 ==NULL)							// nein?
    			{
    				printf("Üngültige E-Mailadresse1!\n");
    				return 0;					// Ende!
    			}
    
    		if(strspn(p1,"@") !=1)		// Auf @ prüfen. Mehr als 1 @?
    			{
    				printf("Üngültige E-Mailadresse2!\n");
    				return 0;					// Ende!
    			}
    
    		vname =email-p1;						// reduziere auf alles vor @
    
    			if(vname == 0)					// keine chars da?
    				{
    					printf("Üngültige E-Mailadresse3!\n");
    					return 0;				// Ende!
    				}
    ///////////////////////////////////////////////////////////		
    			if(strchr(erlaubt, *p3 !=0))
    						{
    							printf("Üngültige E-Mailadresse4!\n");
    							return 0;				// Ende!
    						}
    ///////////////////////////////////////////////////////////			
    			p2= strrchr(email, '.');		// Zeiger auf letzten Punkt setzen
    
    			if (strcmp(p2, ".de") ==0 || strcmp(p2, ".com") ==0 || strcmp(p2,".org") ==0 || strcmp(p2, ".net") ==0)		//überprüfen ob Endungen richtig
    				{
    					printf("Gültige E-Mailadresse!\n");		// ja?
    				}
    
    			else
    				{
    					printf("Üngültige E-Mailadresse5!\n");		// nein?
    				}
    
    	return 0;
    }
    

    So. es klappt soweit alle bei mir. Ich hab verstanden mich nicht so sehr auf dieses domain zu konzentrieren und eher die endungen abzufragen. Dank eurer Hilfe hat der Code auch form angenommen. nun hab ich aber das Problem, wie solls auch anders sein, in der

    /////////////////////////////////

    Zeile.

    ////////////////////////////////

    Ich habe es doch so aufgebaut wie aus dem anderen Programm. Wieso erkennt er die Zeichen nicht so wie es soll? Wenn ich vorher zb. &&&&&@blabla.com schreibe, sagt er mir das ist gültig, obwohl das & zeichen doch gar nicht in der const erlaubt variablen deklariert ist?

    Ich denke mal mein fehler liegt in der Sache mit dem Pointer oder? Könnte mir den vllt einer erklären? Ich kapier das nicht.. 😕

    schönen abend



  • moses030 schrieb:

    Ich hatte schonmal ein Threat geschrieben ...

    Ein threat und ein thread sind zwei ziemlich verschiedene Sachen.
    Ein post ist dann nochmal was Anderes.



  • Dann schau dir mal die Klammerung in den Zeilen an.
    [code]
    if( strchr ( erlaubt, *p3 !=0 ) )
    +------ ------+
    | |
    erster Parameter für zweiter Parameter für strchr
    strchr
    [\code]

    Und was soll p3 überhaupt?
    Und warum ist vname ein char? Du speicherst da die Differenz zweier Zeiger.
    Da ist ein Integertyp (was anderes ist char nicht) schon in Ordnung.
    Aber warum einen, mit einem kleinen Wertebereich, von dem du nicht mal genau weißt, ob er Vorzeichenbehaftet ist.

    SAchau nochmal, wie ich die gültigen Zeichen überprüft habe (war 15:21:32 16.04.2015 erster Codeabschnitt)



  • Hallo Dirk, danke für die antwort.

    Hab mir den Code jetzt nochmal angeschaut... manchmal sieht man den Wald vor lauter bäumen nicht.

    Hab ihn nochnal überarbeitet..

    Ich hab noch eine Frage bzgl deines Codes von damals:

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

    die strtext variable bei dir, ist das in meinem Falle die email variable? könntest du mir die zeile mit der strspn funktion erklären? Die versteh ich nicht ganz.

    Wäre dir sehr dankbar.

    Schönen Sonntag gewünscht.
    👍



  • Oh, sorry, das strtext ist beim Copy&Paste stehen geblieben. 😞

    Ersetze strtext durch email.

    Zu strspn: http://www.cplusplus.com/reference/cstring/strspn/

    Es wird die Anzahl der gültigen Zeichen für den Namen in email ermittelt.
    Da @ nicht mehr zum Namen gehört, muss die Anzahl der gültigen Zeichen der Anzahl der Zeichen vor dem @ entsprechen.



  • Hey Dirk,

    das dachte ich mir schon. Nur leider funktioniert das natürlich auch nicht.. ätzend, ich setz mal den code rein, vllt kannst du mir kurz sagen was falsch ist.. er scheint genau dieses if zu überspringen... 😕

    ...............
    
    		vname =email-p1;						// länge vorm @
    
    			if(vname == 0)					// keine chars da?
    				{
    					printf("Ungültige E-Mailadresse3!\n");
    					return 0;				// Ende!
    				}
    
    			if(strspn(email, erlaubt) == vname)
    				{
    					p2= strrchr(email, '.');		// Zeiger auf letzten Punkt setzen
    
    						if (strcmp(p2, ".de") ==0 || strcmp(p2, ".com") ==0 || strcmp(p2,".org") ==0 || strcmp(p2, ".net") ==0)		
    								//überprüfen ob Endungen richtig
    							{
    								printf("Gültige E-Mailadresse!\n");		// ja?
    							}
    
    						else
    							{
    								printf("Ungültige E-Mailadresse4!\n");		// nein?
    							}
    				}
    
    			else
    				{
    					printf("Ungültige E-Mailadresse5!\n");
    				}	
    
    ..........
    

    er printet mir immer Ungültige E-Mailadresse5 aus...

    vllt kannst du helfen. Danke dir schonmal

    Grüße 😞



  • Schau dir mal den Rückgabewert von strspn an (in einer extra Variable)
    Kannst du zusammen mit vname mit printf ausgeben.
    Möglicherweise ist ein +-1 Fehler drin.



  • Hey dirk,

    ich habe den code so umgeschrieben:

    /*
    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 main(void)
    {
    	char email[100];
    	size_t vname; 
    	int len;
    	char *p1;
    	char *p2;
    	const char *erlaubt ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    
    	printf("Bitte geben Sie eine E-Mailadresse ein: \n");
    	scanf("%s", &email[0]);
    
    	p1 =strchr(email, '@');			//ein @ vorhanden?
    		if(p1 ==NULL)							// nein?
    			{
    				printf("Ungültige E-Mailadresse1!\n");
    				return 0;					// Ende!
    			}
    
    		if(strspn(p1,"@") !=1)		// Auf @ prüfen. Mehr als 1 @?
    			{
    				printf("Ungültige E-Mailadresse2!\n");
    				return 0;					// Ende!
    			}
    
    		vname =email-p1;						// länge vorm @
    
    			if(vname == 0)					// keine chars da?
    				{
    					printf("Ungültige E-Mailadresse3!\n");
    					return 0;				// Ende!
    				}
    
    			len= strspn(email, erlaubt);
    
    			printf("%d\n" , len);
    	}
    

    wenn ich in der len zeile, das so schreibe erkennt er mir alle zeichen die ich vorher eingeben. wenn ich dahinter noch ==vname schreibe, erkennt er mir 0...

    also wenn ich zb hallo@web.de eingebe erkennt er mir 5 zeichen also "hallo" denk ich mal..

    verwirrt mich immer mehr so 😕

    Hast du nen tipp?


Anmelden zum Antworten