void getEmailName(const char *email, char **name /* out */) {
if (!name) {
return;
}
const char *emailName = strchr(email, ':');
if (emailName) {
++emailName;
} else {
emailName = email;
}
char *emailNameCopy = strdup(emailName);
if (!emailNameCopy) {
*name = NULL;
return;
}
char *atSign = strchr(emailNameCopy, '@');
if (atSign) {
*atSign = '\0'; // To remove the '@'
// atSign[1] = '\0'; // To keep the '@'
}
if (*name) {
strcpy(*name, emailNameCopy);
} else {
*name = emailNameCopy;
}
}
Cela crée un pointeur vers le caractère :
(colon
) dans la chaîne. (Il ne fait pas une copie de la chaîne.) Si le :
est trouvé, pointez sur le caractère après lui. Si le :
n'existe pas, utilisez simplement le début de la chaîne (c'est-à-dire n'attribuez pas le préfixe mail:
).
Maintenant, nous voulons supprimer tout à partir de @
, donc nous faisons une copie de la chaîne (emailNameCopy
) et plus tard, couper le @
.
Le code crée ensuite un pointeur sur le caractère @
(atSign) dans la chaîne. Si le caractère @
existe (c'est-à-dire que strchr renvoie non-NULL), le caractère au @
est défini sur zéro, marquant la fin de la chaîne. (Une nouvelle copie n'est pas faite.)
Nous retournons alors la chaîne, ou la copions si un tampon a été donné.
fonctionne très bien, merci – tech74
ne savais pas que vous pouvez le faire avec scanf, très agréable :) –
@ Matt: il est assez cool, non? La seule chose qui me manque le plus lorsque j'utilise C++ iostreams est quelque chose d'équivalent à '% [whatever]' et '% [^ whatever]' de scanf. –