作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将一个字符串操作外包给一个函数,然后在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/
我是一名优秀的程序员,十分优秀!