在 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) 时出现奇怪的结果。

谢谢!

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, " ");
}