在 C 中拆分 char 数组的奇怪输出
weird output of spliting char array in C
我在 Linux 的服务器端 Socket(使用 Telnet 客户端)工作。客户端需要以特定格式输入一行:(1)command(GET/PUT/DEL),(2)key 和(3)associated value(中间用空格分隔)。这个键值对随后被相应地传递给函数(GET/PUT/DEL),该函数将数据保存在共享内存(keyValueStore)中。
我尝试将输入分成 3 个部分,但在读取 Token(2) 时出现奇怪的结果。
- 我可以知道原因吗?关于如何更改我的代码的任何建议?
(我期望的是 key1, key2 )
谢谢!
int main() {
...
char input[BUFSIZE]; // Client Daten -> Server
int bytes_read; // Bytes von Client
...
while (1) {
int bytes_index = -1;
while (1) {
bytes_read = recv(cfd, &input[++bytes_index], 1, 0);
if (bytes_read <= 0) // Check error or no data read
break;
if (input[bytes_index] == '\n') {
// Received a complete line, including CRLF
// Remove ending CR
bytes_index--;
if ((bytes_index >= 0) && (input[bytes_index] == '\r'))
input[bytes_index] = 0;
break;
}
}
if (bytes_index > 0) { // Check for empty line
printf("%s\n", input);
printf("bytes_index: %d\n", bytes_index);
//get the first token
token = NULL;
token = strtok(input, " ");
//walk through other tokens
int i = 0;
while (token != NULL) {
strcpy(&input[i++], token);
printf("Token: %d : %s\n",i, token);
token = strtok(NULL, " ");
}
// Check for client command
if (strcmp(input, "QUIT") == 0)
break;
}
strtok()
的结果引用源缓冲区,因此 strcpy(&input[i++], token);
通过在重叠对象之间执行复制来调用 未定义的行为。
在这种情况下,您应该简单地删除该行,因为复制的结果看起来没有被使用。
如果你以后想使用这些令牌,你应该以不同的方式存储它们。存储指向每个标记的指针可能会起作用(直到新数据被读取到 input
)。它将是这样的:
char* tokens[BUFSIZE];
while (token != NULL) {
tokens[i++] = token;
printf("Token: %d : %s\n",i, token);
token = strtok(NULL, " ");
}
我在 Linux 的服务器端 Socket(使用 Telnet 客户端)工作。客户端需要以特定格式输入一行:(1)command(GET/PUT/DEL),(2)key 和(3)associated value(中间用空格分隔)。这个键值对随后被相应地传递给函数(GET/PUT/DEL),该函数将数据保存在共享内存(keyValueStore)中。
我尝试将输入分成 3 个部分,但在读取 Token(2) 时出现奇怪的结果。
- 我可以知道原因吗?关于如何更改我的代码的任何建议? (我期望的是 key1, key2 )
谢谢!
int main() {
...
char input[BUFSIZE]; // Client Daten -> Server
int bytes_read; // Bytes von Client
...
while (1) {
int bytes_index = -1;
while (1) {
bytes_read = recv(cfd, &input[++bytes_index], 1, 0);
if (bytes_read <= 0) // Check error or no data read
break;
if (input[bytes_index] == '\n') {
// Received a complete line, including CRLF
// Remove ending CR
bytes_index--;
if ((bytes_index >= 0) && (input[bytes_index] == '\r'))
input[bytes_index] = 0;
break;
}
}
if (bytes_index > 0) { // Check for empty line
printf("%s\n", input);
printf("bytes_index: %d\n", bytes_index);
//get the first token
token = NULL;
token = strtok(input, " ");
//walk through other tokens
int i = 0;
while (token != NULL) {
strcpy(&input[i++], token);
printf("Token: %d : %s\n",i, token);
token = strtok(NULL, " ");
}
// Check for client command
if (strcmp(input, "QUIT") == 0)
break;
}
strtok()
的结果引用源缓冲区,因此 strcpy(&input[i++], token);
通过在重叠对象之间执行复制来调用 未定义的行为。
在这种情况下,您应该简单地删除该行,因为复制的结果看起来没有被使用。
如果你以后想使用这些令牌,你应该以不同的方式存储它们。存储指向每个标记的指针可能会起作用(直到新数据被读取到 input
)。它将是这样的:
char* tokens[BUFSIZE];
while (token != NULL) {
tokens[i++] = token;
printf("Token: %d : %s\n",i, token);
token = strtok(NULL, " ");
}