【发布时间】:2019-03-03 08:05:18
【问题描述】:
C 编程新手在这里寻求一点帮助!我有一个缓冲区,其中包含客户端程序提供的一些数据,可以这样说:
pcity:阿姆斯特丹城市
我的问题是在服务器内部我想遍历这个循环并“弹出”我已经向客户端发送答案的命令和参数。在此示例中,假设在处理 pcityAmsterdam 部分后,我希望缓冲区变为 gcity。
这是我目前的代码:
while(sizeof(incbuf) > 0)
{
if(incbuf[0] == 103) //get request
{
puts("get req");
memmove(incbuf, incbuf+1, strlen(incbuf));
//puts(incbuf);
key = strtok(incbuf, ":");
//printf("%s\n",key);
res = get(key);
printf("%s\n",&res);
if(res != NULL) //we got a match
{
puts("match");
if(servbuf[0] == '\0')
servbuf[0] = 102;
else
servbuf[strlen(servbuf)] = 102;
strcat(servbuf, res);
send(new_socket,servbuf,1024, 0);
}
else //not found
{
puts("not a match");
if(servbuf[0] == '\0')
servbuf[0] = 110;
else
servbuf[strlen(servbuf)] = 110;
strcat(servbuf, &res);
printf("BEFORE THE NOT FOUND: %s\n", servbuf);
send(new_socket,servbuf,1024, 0);
}
memmove(incbuf, incbuf+strlen(key), strlen(incbuf));
printf("%s\n", incbuf);
}
else if(incbuf[0] == 112) //put request
{
puts("put req");
memmove(incbuf, incbuf+1, strlen(incbuf));
char* keytoken = strtok(incbuf, ":"); //get rid of the type
printf("token: %s\n",keytoken );
char* key = malloc((strlen(keytoken)));
char* value = malloc((strlen(incbuf))); //Amsterdam--> key :city
strcpy(key, keytoken);
printf("key: %s\n",key );
char* valuetoken = strtok(NULL, ": ");
strcpy(value, valuetoken);
printf("value: %s\n",value );
put(key, value);
memmove(incbuf, incbuf+strlen(key)+strlen(value)+1, strlen(incbuf));
printf("AFTER MEMMOVE THIS IS THE BUF: %s\n", incbuf);
}
此时我知道 strtok 会弄乱我的 incbuf 数组,但我需要它来标记数组。可能是这里的设计问题?
有什么建议吗?
【问题讨论】:
-
“命令”之间是否有某种分隔符?在您展示的示例中,
pcity命令(及其参数)和gcity命令之间似乎有一个空格。根据您的协议规范,这个空间是强制性的吗? -
-
然后循环遍历缓冲区(你知道它的实际长度吗?)并将字符复制到另一个缓冲区中。当您点击命令终止符 (
0) 时,您将拥有一个可以处理的完整命令。处理当前命令,然后在接收缓冲区上继续循环。 -
while(sizeof(incbuf) > 0)应该做什么?sizeof(incbuf)是一个永远不会改变的常数。
标签: c string parsing tokenize c-strings