Dies ist eine alte Version des Dokuments!
#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); }
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 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 „@“.