我有两个字符串,一个带有电子邮件地址,另一个是空的。
如果电子邮件地址是例如"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;
}
基本上,我每次都会从电子邮件地址中获取一个字符,并将其添加到新字符串中。例如,如果新字符串上有一个字符串,现在我将使用b
将strcat
添加到其中....
答案 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
的相应字符(您将需要使用i
对email
和temp
)进行索引。
另外,请记住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()