我有以下内容:
LPSTR email // Has data in it already
LPSTR index=strchr(email,'@');
现在我想插入一个新字符串:
LPSTR username
从字符串开头到“索引”的“电子邮件”部分。
例如: 电子邮件= “roel@emailI-ISP.com” 所以username =“roel”。
是否有快速完成的功能,还是需要构建一个功能?
罗埃尔
答案 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。