我试图从缓冲区中提取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!
有什么想法吗?
答案 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
。
答案 2 :(得分:1)
使用调试器并逐步执行您的程序。或者用笔和纸手动完成。 当你遇到第一个'\ n'时会发生什么?之后会发生什么? 你被困在'\ n'上,因为在打印解析的消息后你永远不会移动读指针。
答案 3 :(得分:0)
* tbuf ='\ 0'应该是*(tbuf-1),因为你在一个不必要的simbol之后添加了终止零。为什么你需要调用memset。您可以在缓冲区中写入旧数据。
答案 4 :(得分:0)
这是固定代码......
问题:
#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 ..如果你想要一个简单的代码而不是那个让我知道的代码