c - 在c中的函数中外包strtok()

标签 c

我想将一个字符串操作外包给一个函数,然后在main.c中询问结果。这不起作用,我不明白为什么。

#include <stdio.h>
#include <string.h>

void splitRequest(char request[], char method[], char ressource[], char proto[]) {

    method = strtok(request, " ");
    ressource = strtok(NULL, " ");
    proto = strtok(NULL, " ");
    printf("\nResult:\n\nmethod:\t\t%s\nressource:\t%s\nproto:\t\t%s\n",method,ressource,proto);
}

int main()
{    
    char method[50], ressource[50], proto[50], request[50];
    memset(method, '\0', 50);
    memset(ressource, '\0', 50);
    memset(proto, '\0', 50);
    memset(request, '\0', 50);
    strcpy(request,"Get /index.htm HTTP/1.1");

    //rehash query
    splitRequest(request, method, ressource, proto);

    //check Results
    printf("\nResult:\n\nmethod:\t\t%s\nressource:\t%s\nproto:\t\t%s\n",method,ressource,proto);

    return 0;
}

最佳答案

splitRequest函数中,所有参数都是指针。更重要的是,它们是局部变量。因此对它们的所有更改(例如使它们指向其他任何地方)只会影响局部变量,不会影响其他变量。

解决方案是复制到内存中。也许类似

char *temp;

if ((temp = strtok(request, " ")) != NULL)
{
    strcpy(method, temp);
}

// And so on...
<小时/>

稍微阐述一下我的意思......

在 C 语言中,所有函数参数都按值传递。这意味着它们的值被复制,并且该函数仅具有该值的本地副本。更改副本当然不会更改原始值。

指针也是如此。当您调用 splitRequest 函数时,您传递的指针将被复制。在函数内部,变量 method (例如)指向您在 main 函数中定义的数组的内存。当您分配给此变量时,就像您所做的那样

method = strtok(...);

您只修改局部变量,即指针的本地副本。当函数返回局部变量 method 超出范围时,对其所做的所有更改都会丢失。

这个问题有两种解决方案。一种是模拟按引用传递(C 没有这种功能,这就是必须模拟它的原因),但只要有数组,这种方法就不起作用。因此,第二个也是最简单的解决方案:复制到局部变量方法指向的内存,这就是我上面展示的内容。

但重要的是:当您调用 splitRequest 函数并传递数组时,数组本身不会被传递。相反,数组衰减为指向其第一个元素的指针,并且在函数内部,参数定义的变量是指针而不是数组。

来电

splitRequest(request, method, ressource, proto);

等于

splitRequest(&request[0], &method[0], &ressource[0], &proto[0]);

以及函数声明

void splitRequest(char request[], char method[], char ressource[], char proto[])

等于

void splitRequest(char *request, char *method, char *ressource, char *proto)

所以不复制字符串,只复制指针。否则,在分配给指针时,您会收到错误,因为您不能分配给数组,只能复制到它们。

关于c - 在c中的函数中外包strtok(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40659377/

相关文章:

c++ - 使用dsp和图像处理的巡线机器人

使用线程检查命令行参数是否是回文词

给定明文和密文计算对称加密的 key

c - 我如何为我的应用程序中创建的每个线程打开单独的终端?

c - 在 Linux 上处理多线程断管情况的服务器端套接字最佳实践是什么?

c - 如何在Linux中使用c的 `getch`函数?

c - 在没有 LF CR 的情况下处理传入的串行流

c - 如何创建结构体c的动态矩阵?

C 宏在一个范围内运行循环

iphone - 有一条路径跟随另一条路径