【问题标题】:How to extract chars from char array如何从字符数组中提取字符
【发布时间】:2010-12-22 08:06:08
【问题描述】:

我正在尝试从缓冲区中提取 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!

有什么想法吗?

【问题讨论】:

  • C 只是比汇编程序更简单。大声笑!

标签: c arrays char


【解决方案1】:

在开始第二个和后续循环之前,您需要重置 tbuf 以指向 tempbuffer 的开始。

【讨论】:

  • 感谢杰克逊! tbuf = &tempbuffer[0];
【解决方案2】:

我可以看到的一些问题:

1:memset 的参数不正确。

改变

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

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

其实这里不需要memset

2:遇到\n 时不增加指针msg

添加

msg++;

之前/之后

*tbuf = '\0';

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

添加

tbuf = &tempbuffer[0];

在第一个 while 循环内。

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

因为此时您已经增加了tbuf

See it work

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 就像他说的,memset(tempbuffer, 0, sizeof((char) 1024));应该是 memset(tempbuffer, 0, sizeof(tempbuffer));
    【解决方案4】:

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

    【讨论】:

    • 嘿 Dani,tbuf 的好消息。对于 memset,我只是想确保没有有趣的东西。
    【解决方案5】:

    这是固定代码...

    问题:

    1. sizeof 错误
    2. 您没有在每个 '\n' 后增加 msg
    3. 您没有在每个 '\n' 之后将 tbuf 设置回 tempbuffer 的开头
    4. 虽然它并不总是报告为错误,但您缺少一些包含文件,这可能会导致问题
    #include #include char *msg = "1~Message~ILOVEYOU\r\n2~Message~Doyouloveme?\r\n3~Message~OfcourseIdo!Not!\r\n"; 字符临时缓冲区[1024]; char *tbuf = &tempbuffer[0]; int main(int argc, char *argv[]) { argc = argc; argv[0] = argv[0]; /* 开始解析 */ 而( *msg != '\0' ) { 而( *msg != '\n' ) { 而( *msg != '\r' ) { *tbuf = *味精; 味精++; tbuf++; } 味精++; tbuf++; } *tbuf = '\0'; /* 用于调试目的的打印输出缓冲区 */ printf("x %s\n", tempbuffer); /* 在重新开始解析缓冲区之前清除 tempbuffer */ memset(tempbuffer, 0, sizeof(tempbuffer)); tbuf = &tempbuffer[0]; 味精++; } 返回0; }

    【讨论】:

      【解决方案6】:

      我建议你看看字符串函数 strtok..如果你想要一个比提供的更简单的代码,请告诉我

      【讨论】:

      • 嘿 Syntax_Error,我可以使用 strtok - 事实上,一直在使用 strtok,但我不高兴它不是线程友好的。我的要求是解析“\r\n”,然后是“~”。我查看了 strtok_r 并且不知道(在阅读了所有示例之后)如何使用 strtok_r。
      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多