====== Mailadresse auswerten - Mögliche Lösungen ====== ===== C ===== #include #include 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 ===== 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. 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 :: [Char] -> [Char] mail [] = [] mail (x:xs) = if (x=='@') then xs else mail xs