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;
}
}
Esto crea un puntero al carácter :
(colon
) dentro de la cadena. (No hace una copia de la cadena). Si se encuentra el :
, señale al personaje que lo sigue. Si el :
no existe, solo use el comienzo de la cadena (es decir, no asuma el prefijo mail:
).
Ahora queremos quitar todo, desde el @
en adelante, por lo que hacemos una copia de la cadena (emailNameCopy
) y luego cortamos el @
.
El código crea un puntero al carácter @
(atSign) dentro de la cadena. Si el carácter @
existe (es decir, strchr no es NULL), el carácter en @
se establece en cero, marcando el final de la cadena. (No se realiza una copia nueva).
Devolvemos la cadena o la copiamos si se proporcionó un buffer.
funciona muy bien, gracias – tech74
No sabía que se podía hacer esto con scanf, muy agradable :) –
@ Matt: es bastante cool, ¿no es así? Lo único que echo de menos cuando uso C++ iostreams es algo equivalente a scanf's '% [whatever]' y '% [^ whatever]'. –