gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:36:33 25 4
gpt4 key购买 nike

我想将一个字符串操作外包给一个函数,然后在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com