在C中操纵字符串

时间:2014-10-16 02:39:51

标签: c string parsing

我有一个文本文件,其中包含许多电子邮件,每封电子邮件的开头是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);
            }
    ...

1 个答案:

答案 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';
}