使用strchr构建一个字符串

0 c

我有以下内容:

LPSTR email // Has data in it already
LPSTR index=strchr(email,'@');
Run Code Online (Sandbox Code Playgroud)

现在我想插入一个新的字符串:

LPSTR username
Run Code Online (Sandbox Code Playgroud)

从字符串开头到"索引"的"电子邮件"部分.

例如:email ="roel@emailI-ISP.com"so username ="roel".

是否有功能快速完成或我需要构建一个?

罗埃尔

小智 6

RFC 5321定义的电子邮件地址比您的代码假定的更复杂.例如:

"Strange@Name"@example.com
Run Code Online (Sandbox Code Playgroud)

是一个有效的电子邮件地址.如果您的代码具有安全隐患,那么您将需要更强大的功能.

假设不是这样,strrchr可用于查找最后一个@字符.由于电子邮件地址的域/地址部分不能包含@,因此可以可靠地找到@ you'后.

获得索引后,在C中有多个选项可用于字符串拆分.

如果您拥有电子邮件字符串缓冲区并且不需要保持原样,则可以将其拆分而无需任何分配(只需确保您只发送电子邮件而不是用户名/域名):

if (index)
{
  *index = '\0';
  username = email;
  domain = index + 1;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以以相同的方式拆分,但使用strdup来分配新的字符串缓冲区(记得自由调用):

if (index)
{
  *index = '\0';
  username = strdup(email);
  domain = strdup(index + 1);
  *index = '@'; /* if you need to use email in full again */
}
Run Code Online (Sandbox Code Playgroud)

如果您不能或不想修改电子邮件缓冲区,您可以执行以下操作:

if (index)
{
  ptrdiff_t atOffset = index - email;
  username = calloc(atOffset + 1, sizeof(CHAR));
  strncpy(username, email, atOffset);
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是C++,则应该使用字符串封装类而不是C风格的字符串操作.