如何获取电子邮件地址的开头

时间:2012-06-09 12:22:53

标签: c string

我有两个字符串,一个带有电子邮件地址,另一个是空的。 如果电子邮件地址是例如"abc123@gmail.com",我需要将@之前的电子邮件地址的开头传递给第二个字符串。例如:

第一个字符串:"abc123@gmail.com"

第二个字符串:"abc123"

我写了一个循环,但它不起作用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char email[256] = "abc123@gmail.com";
char temp[256];
int i = 0;

while (email[i] != '@')
{
      temp = strcat(temp, email[i]);
      i++;
}

printf ("%s\n", temp);
system ("PAUSE");
return 0;
}

基本上,我每次都会从电子邮件地址中获取一个字符,并将其添加到新字符串中。例如,如果新字符串上有一个字符串,现在我将使用bstrcat添加到其中....

4 个答案:

答案 0 :(得分:2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char email[256] = "abc123@gmail.com";
char temp[256];
size_t i = 0;

#if 0
for (i=0; email[i] && email[i] != '@'; i++) {;}

   /* at the end of the loop email[i] is either the first '@',
   ** or that of the terminating '\0' (aka as strlen() )
   */

#else

i = strcspn(email, "@" );

   /* the return value for strcspn() is either the index of the first '@'
   * or of the terminating '\0'
   */

#endif

memcpy (temp, email, i);
temp[i] = 0;


printf ("%s\n", temp);
system ("PAUSE");
return 0;
}

更新:完全不同的方法是在循环内进行复制(我猜这是OP的意图):

for (i=0; temp[i] = (email[i] == '@' ? '\0' : email[i]) ; i++) {;}

答案 1 :(得分:2)

有更好的方法可以解决这个问题(例如,通过查找@的索引(通过strcspn或其他方式)并执行memcpy),但您的方法非常接近工作,所以我们可以做一些小的调整。


正如其他人所认识到的,问题在于这一行:

temp = strcat(temp, email[i]);

据推测,您正试图将i email位置的角色复制到temp的相应位置。但是,strcat不是正确的方法:strcat将数据从一个char*复制到另一个char*,也就是说,它会复制字符串。您只想复制一个字符,这正是=所做的。

从更高级别查看(因此我不只是告诉您答案),您希望将temp的相应字符设置为email的相应字符(您将需要使用iemailtemp)进行索引。

另外,请记住C中的字符串必须由'\0'终止,因此在完成字符串复制后,必须将temp的下一个字符设置为'\0'。 (在这种思路上,您应该考虑如果您的电子邮件字符串中没有@会发生什么,您的while循环将继续超过字符串email的结尾:请记住,您可以通过character == '\0'或仅使用character作为条件判断您是否在字符串的末尾。)

答案 2 :(得分:2)

指针。首先,strcat()返回一个char指针,由于某些原因(我听到all C programmers must know),C不能将其转换为char数组。其次,strcat()的第二个参数应该是一个char指针,而不是char。

temp = strcat(temp, email[i]);替换temp[i] = email[i];应该可以解决问题。

此外,在循环结束后,使用空字符终止字符串。

temp[i] = '\0';

(循环结束后,i等于提取字符串的长度,因此temp[i]是终端应该去的地方。)

答案 3 :(得分:0)

您可能想尝试使用strtok()