Dies ist eine alte Version des Dokuments!


Mailadresse auswerten - Mögliche Lösungen

C

mail.c
#include <stdio.h>
#include <stdlib.h>
 
int strlen_ ( const char* m )
{
    // i hochzählen, solange wir nicht auf das Nullbyte stoßen
    int i=0;
    for ( ;m[i]; i++);
    return i;
}
 
void mail ( char* m )
{
    int i=0;
    int urlbegin=0, urlende, urllength;
    // Suchen des @-Zeichen im String
    for ( ; m[i]; i++)
    {
        if (m[i]=='@')
        {
            urlbegin=i;
            break;
        }
    }
 
    // @ wurde nicht oder an 0. Stelle gefunden
    if (urlbegin==0)
    {
        printf ("@ wurde nicht gefunden.\n");
        exit(0);
    }
 
    urlbegin++;
 
    // Berechnung der Länge der URL
    urlende = strlen_ ( m );
    urllength = urlende - urlbegin + 1;
 
    // Kopieren der URL an den Anfang
    for (i=0; i<urllength; i++)
    {
        m[i] = m[urlbegin+i];
    }
 
    // Anfügen des Nullbyte; damit Abschließen des String
    m[i] = '\0';
}
 
int main ()
{
    char m[32] = "c-training@proggen.org\0";
 
    printf ("%8d %s\n", strlen_(m), m);
    mail ( m );
    printf ("%8d %s\n", strlen_(m), m);
}

Fortran

Hier dargestellt sind zwei mögliche Lösungen. mail löst das Problem mithilfe der eingebauten Funktion index, die einen String in einem anderen sucht, und den Index des ersten auftretenden Zeichens zurückgibt; die mail2-Funktion gibt eine Lösung an, bei der in einer Schleife nach dem @-Symbol gesucht wird. Beide Male muss die gesamte restliche Zeichenkette mit Leerzeichen gefüllt werden.

mail.F90
SUBROUTINE mail2 ( address )
  implicit none
  CHARACTER*(*) address
  integer k, urlbegin, urlende, urllength
 
  urlbegin=0
 
  ! Suche nach dem @ in der URL
  do k=1, LEN(address)
    if (address(k:k) == '@') then
      urlbegin = k
      EXIT
    endif    
  enddo
 
  ! es wurde nicht oder an der 1. Stelle gefunden
  if (urlbegin==1) then
    stop "@ steht an der ersten Stelle, oder wurde nicht gefunden"
  endif
 
  ! Berechnung des Beginns / Ende der URL im String
  urlbegin=urlbegin+1
  urlende = LEN_TRIM(address)
  urllength = (urlende-urlbegin+1)
 
  ! Kopieren der URL an den Anfang und auffüllen mit Leerzeichen
  address(1:urllength) = address(urlbegin:urlende)
  address(urllength+1:LEN(address)) = ' '
END SUBROUTINE
 
SUBROUTINE mail ( address )
  implicit none
  CHARACTER*(*) address
  INTEGER k, urlbegin, urlende,urllength
 
  urlbegin = index (address, "@", .TRUE.) +1
 
  if (urlbegin <= 0) then
    stop "@ wurde nicht gefunden"
  endif
 
  urlende = LEN_TRIM(address)
  urllength = (urlende-urlbegin+1)
 
  address(1:urllength) = address(urlbegin:urlende)
  address(urllength+1:LEN(address)) = ' '
END SUBROUTINE
 
program main
  implicit none
  CHARACTER*32 :: m = "fortran@proggen.org"
  CHARACTER*32 :: m2 = "fortran@proggen.org"
 
  write (*,*) len_trim(m), m
  call mail ( m )
  write (*,*) len_trim(m), m
 
  write (*,*) len_trim(m2), m2
  call mail2 ( m2 )
  write (*,*) len_trim(m2), m2
end program

Haskell

Haskell untrstützt keine Arbeit auf Variablen, geschweigedenn Feldern innerhalb einer Funktion. Es ist lediglich möglich eine Liste einer Funktion zu übergeben und eine (andere) Liste zurückgeliefert zu bekommen. Daher liefert die Funktion nur alle Zeichen ab dem „@“ zurück, dh. „verschluckt“ alle Zeichen bis einschließlich dem „@“.

mail.hs
mail :: [Char] -> [Char]
mail [] = []
mail (x:xs) = if (x=='@') then xs
                          else mail xs