如何从char数组中提取字符

时间:2010-12-22 08:06:09

标签: c arrays char

我试图从缓冲区中提取char数组,但在提取第一个char数组后停止工作。

char *msg = "1~Message~ILOVEYOU\r\n2~Message~Doyouloveme?\r\n3~Message~OfcourseIdo!Not!\r\n";
char tempbuffer[1024];
char *tbuf;

tbuf = &tempbuffer[0];

/* Start parsing */
while (*msg != '\0') {

    while(*msg != '\n') {

        while (*msg != '\r') {
            *tbuf = *msg;
            msg++;
            tbuf++;
        } /* closing '\r' */

        msg++;
        tbuf++;
    } /* closing '\n' */

    *tbuf = '\0';

    /* Printout buffer for debugging purposes */
    printf("x %s\n", tempbuffer);

    /* Clear tempbuffer before starting to parse the buffer again */
    memset(tempbuffer, 0, sizeof((char) 1024));
} /* closing '\0' */

return 0;

}

printf显示1~Message~ILOVEYOU,它停止工作。 我期待以下输出

1~Message~ILOVEYOU
2~Message~Doyouloveme?
3~Message~OfcourseIdo!NOT!

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

在启动第二个和后续循环之前,需要重置tbuf以指回tempbuffer的开头。

答案 1 :(得分:2)

我可以看到的一些问题:

1:memset的参数不正确。

更改

memset(tempbuffer, 0, sizeof((char) 1024));

memset(tempbuffer, 0, sizeof(tempbuffer));

实际上这里并不需要memset

2:遇到msg时,不会递增指针\n

添加

msg++;

之前/之后

*tbuf = '\0';

3:在每次迭代开始时将tbuf重置为数组的开头

添加

tbuf = &tempbuffer[0];

在第一个while循环内。

4:*tbuf = '\0';应为*(tbuf-1) = '\0';

因为此时你已经增加了tbuf

See it work

答案 2 :(得分:1)

使用调试器并逐步执行您的程序。或者用笔和纸手动完成。 当你遇到第一个'\ n'时会发生什么?之后会发生什么? 你被困在'\ n'上,因为在打印解析的消息后你永远不会移动读指针。

答案 3 :(得分:0)

* tbuf ='\ 0'应该是*(tbuf-1),因为你在一个不必要的simbol之后添加了终止零。为什么你需要调用memset。您可以在缓冲区中写入旧数据。

答案 4 :(得分:0)

这是固定代码......

问题:

  1. sizeof错了
  2. 每个'\ n'
  3. 后你没有增加消息
  4. 在每个'\ n'
  5. 之后,你没有将tbuf设置回tempbuffer的开头
  6. 虽然它并不总是被报告为错误,但您缺少一些可能导致问题的包含文件
  7. #include <string.h>
    #include <stdio.h>
    
    
    
    char *msg = "1~Message~ILOVEYOU\r\n2~Message~Doyouloveme?\r\n3~Message~OfcourseIdo!Not!\r\n";
    char tempbuffer[1024];
    char *tbuf = &tempbuffer[0];
    
    int main( int argc, char *argv[] )
    {
    
        argc = argc;
        argv[0] = argv[0];
    
        /* Start parsing */
        while( *msg != '\0' )
        {
    
            while( *msg != '\n' )
            {
                while( *msg != '\r' )
                {
                    *tbuf = *msg;
                    msg++;
                    tbuf++;
                }
                msg++;
                tbuf++;
            }
    
            *tbuf = '\0';
    
            /* Printout buffer for debugging purposes */
            printf("x %s\n", tempbuffer);
    
            /* Clear tempbuffer before starting to parse the buffer again */
            memset(tempbuffer, 0, sizeof(tempbuffer));
            tbuf = &tempbuffer[0];
            msg++;
        }
        return 0;
    }
    

答案 5 :(得分:0)

我建议你看一下字符串函数strtok ..如果你想要一个简单的代码而不是那个让我知道的代码