Адреса электронной почты, определенные в RFC 5321, более сложны, чем предполагает ваш код. Например:
"Strange@Name"@example.com
является действительным адресом электронной почты. Если ваш код имеет последствия для безопасности, вам понадобится что-то более надежное.
В противном случае strrchr можно использовать для поиска последнего символа @. Поскольку доменная / адресная часть адреса электронной почты не может содержать @, это надежно найдет @, который вы ищете.
Как только у вас есть индекс, у вас есть несколько опций в C для разделения строк.
Если у вас есть строковый буфер электронной почты и вам не нужно сохранять его в целости, вы можете разделить его без необходимости каких-либо выделений (просто убедитесь, что вы используете только бесплатную электронную почту, а не имя пользователя / домен):
if (index)
{
*index = '\0';
username = email;
domain = index + 1;
}
Или вы можете разделить таким же образом, но использовать strdup для выделения новых строковых буферов (не забудьте вызвать free):
if (index)
{
*index = '\0';
username = strdup(email);
domain = strdup(index + 1);
*index = '@'; /* if you need to use email in full again */
}
Если вы не можете или не хотите изменять буфер электронной почты, вы можете сделать что-то вроде:
if (index)
{
ptrdiff_t atOffset = index - email;
username = calloc(atOffset + 1, sizeof(CHAR));
strncpy(username, email, atOffset);
}
если вы используете C ++, вам, вероятно, следует использовать класс инкапсуляции строк вместо манипулирования строками в стиле C.