解析字符串C.

时间:2011-05-13 09:42:11

标签: c string parsing space

我正试图从电子邮件中获取正文,但我不知道如何。身体与头部隔开一个空间。你能给我一些例子吗?

感谢。

消息看起来像这样(带标题和正文):

From username@localhost  Fri May 13 12:28:30 2010
Return-Path: <username@localhost>
X-Original-To: recipe@localhost
Delivered-To: recipe@localhost
Received: from cristi?localhost (localhost [127.0.0.1])
by Notebook (Postfix) with SMTP id 50F6F809E0
for <test@localhost>; Fri, 13 May 2010 12:28:30 +0300 (EEST)
Message-Id: <20110513092830.50F6F809E0@Cristi-Notebook>
Date: Fri, 13 May 2010 12:28:30 +0300 (EEST)
From: username@localhost
To: undisclosed-recipients:;

Text Body

.

到目前为止:

while ( buffer_recieved[begin]){
    if ( buffer_recieved[begin] == '\r' && buffer_recieved[begin+1] == '\n' ) {
         body[end++]=buffer_recieved[begin];
    }
    begin++;
}
body[end]=0;

3 个答案:

答案 0 :(得分:0)

找到POP RFC。阅读规范。

我没看过POP,但我读过SMTP。在SMTP中,我想我记得标题以“\ r \ n \ r \ n”结尾,同样是正文。对POP来说也许是一样的。

答案 1 :(得分:0)

如果我理解正确,身体被换行分隔,所以我们可以保留一个变量,告诉我们是否已经遇到了换行符。在这种情况下,复制文本,否则检查我们是否已达到它。

bool foundBody = false;
char *bodyBegin = "\r\n\r\n";
int i = 0,j = 0, k = 0;

while(bufferReceived[i]) {
    if(foundBody)
        body[j++] = bufferReceived[i];
    else {
        if(bufferReceived[i] == bodyBegin[k])
            foundBody = bodyBegin[k++] == '\0';
        else
            k = 0;
    }

    i += 1;
}

body[j] = '\0';

答案 2 :(得分:0)

你这太复杂了。你的身体开始if(strnstr(buffer, "\r\n\r\n", sizeof(buffer)) != NULL)。现在,您只需要编码缓冲区在“\ r \ n \ r \ n”序列中分割的4个异常。

另一种方法是在读取“\ r \ n”之前进行行读取,然后转到正文的缓冲区。这是首选,因为您可以更容易地存储标头值,并且从行读取到较大缓冲区的开销可以忽略不计。