Использование strchr для построения строки - PullRequest
0 голосов
/ 05 июня 2010

У меня есть следующее:

LPSTR email // Has data in it already
LPSTR index=strchr(email,'@');

Теперь я хочу вставить в новую строку:

LPSTR username

часть "email" от начала строки до "index".

Например: электронная почта = "roel@emailI-ISP.com" так username = "roel".

Есть ли функция, чтобы сделать это быстро, или мне нужно построить ее?

Рул

Ответы [ 2 ]

6 голосов
/ 05 июня 2010

Адреса электронной почты, определенные в 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.

1 голос
/ 05 июня 2010
size_t indexPos = index - email;
LPSTR username = malloc(indexPos + 1);
memcpy(username, email, indexPos);
username[indexPos] = '\0';

Не забудьте проверить, что index равен NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...