使用strchr构建一个字符串

时间:2010-06-05 12:22:14

标签: c

我有以下内容:

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

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

LPSTR username

从字符串开头到“索引”的“电子邮件”部分。

例如: 电子邮件= “roel@emailI-ISP.com” 所以username =“roel”。

是否有快速完成的功能,还是需要构建一个功能?

罗埃尔

2 个答案:

答案 0 :(得分:6)

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

"Strange@Name"@example.com

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

假设不是这样,strrchr可用于查找最后一个@字符。由于电子邮件地址的域名/地址部分不能包含@,因此可以正确地找到@您之后。

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

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

if (index)
{
  *index = '\0';
  username = email;
  domain = index + 1;
}

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

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 :(得分:1)

size_t indexPos = index - email;
LPSTR username = malloc(indexPos + 1);
memcpy(username, email, indexPos);
username[indexPos] = '\0';

不要忘记检查index是否为NULL。