Другое решение, которое не зависит от какой-либо особой возможности и легко способно обнаруживать ошибки, является следующим. Обратите внимание, что вам нужно будет освободить строку, когда функция extractUsername () завершится успешно.
Обратите внимание, что в C вы просто перемещаетесь в последовательности символов, используя арифметику указателей. Существует несколько стандартных библиотечных функций, но они намного проще, чем что-либо, способное извлекать информацию из строки.
Есть и другие проблемы с обнаружением ошибок, например, наличие более чем одного '@'. Но этого должно быть достаточно в качестве отправной точки.
// Extract "mail:username@example.com"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char * MailPrefix = "mail:";
const char AtSign = '@';
char * extractUserName(const char * eMail)
{
int length = strlen( eMail );
char * posAtSign = strrchr( eMail, AtSign );
int prefixLength = strlen( MailPrefix );
char * toret = (char *) malloc( length + 1 );
if ( toret != NULL
&& posAtSign != NULL
&& strncmp( eMail, MailPrefix, prefixLength ) == 0 )
{
memset( toret, 0, length +1 );
strncpy( toret, eMail + prefixLength, posAtSign - prefixLength - eMail );
}
else {
free( toret );
toret = NULL;
}
return toret;
}
int main()
{
const char * test = "mail:baltasarq@gmail.com";
char * userName = extractUserName( test );
if ( userName != NULL ) {
printf( "User name: '%s'\n", userName );
free( userName );
} else {
fprintf( stderr, "Error: invalid e.mail address\n" );
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}