我有一个文本文件,其中包含许多电子邮件,每封电子邮件的开头是3行标题信息,其中包括From:,Subject:,Date:。我知道每个ctrl-L字符后都是标题行,因此c == 12行。
目前我的from数组获得了一行文字,如:
From: Rollen Awen <reaw@yahoo.com>
或
From: muller@ngc.csc.ncsu.spu
所以现在我正在尝试使用分隔符来保留电子邮件地址,但我不知道如何去做。我必须能够处理任何类型的情况,无论它是否包含在&lt; &GT;或者如果它包含在2个空格之间。
例如,我想更改
From: Rollen Awen <reaw@yahoo.com>
仅限reaw@yahoo.com
或改变
From: muller@ngc.csc.ncsu.spu
加入muller@ngc.csc.ncsu.spu
...
FILE *emaildata = fopen (argv[1], "r");
while((c=fgetc(emaildata))!=EOF){
if(c==12){
numberemails++;
fgets(nothing, sizeof(nothing), emaildata);
fgets(from, sizeof(from), emaildata);
fgets(subject, sizeof(subject), emaildata);
fgets(date, sizeof(date), emaildata);
//printf("%s", from);
}
...
答案 0 :(得分:3)
如果你memrchr()
,这需要#define _GNU_SOURCE
glibc给你。如果您没有这个功能,我相信您可以找到类似的功能或自己编写。
// input is either like "John Smith <jsmith@example.com>" or "jsmith@example.com"
// leading and trailing whitespace is skipped
// email is an out-param, must be an array at least as long as input
void parse_email_address(const char* input, char* email)
{
// skip leading whitespace
while (isspace(*input)) {
++input;
}
size_t len = strlen(input);
// ignore trailing whitespace
while (len > 0 && isspace(input[len - 1])) {
--len;
}
// parse friendly addresses like "John Smith <jsmith@example.com>"
// '>' must come last, and '<' must come before it
if (len > 0 && input[len - 1] == '>') {
const char* left = memrchr(input, '<', len);
if (left) {
len -= left - input + 2; // 2 for '<' and '>'
input = left + 1;
}
}
memcpy(email, input, len);
email[len] = '\0';
}