鱼C论坛

 找回密码
 立即注册
查看: 2475|回复: 5

[已解决]求问一下c语言里strtol()这个函数的参数问题

[复制链接]
发表于 2022-12-4 01:07:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
它原型是这样
long int strtol(const char *nptr, char **endptr, int base);
我看书上和各种教学贴里都是说,第二个参数endptr是一个指向指针的指针,它指向的那个指针指向第一个非法字符的地址
可是我看帖子中和书上使用的时候,都是把它声明为一个指针,然后第一个非法字符的地址直接作为实参传递给它
虽然我知道这样子简单一些,可是原型不应该是这样的呀,求解答

网上找的一个例子

char buffer[20]="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 2));
printf("%s/n", stop);
输出结果:
2
379cend$3
char *stop;
strtol(buffer,&stop,2);
是在说把stop声明为一个指向char类型数据的指针,然后strtol会把一个地址传递给它吧
这样的话为什么原型里形参要是指针的指针,直接是个指针不就行了吗...
最佳答案
2022-12-4 09:28:37
你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop   把stop传进去,你是这个意思吧。

因为函数里面要给stop指针赋值,使它指向第一个非数字的字符。如果直接传进去一个stop  修改的是stop的副本,没法修改到函数外面的stop变量
只有定义成char** endptr   然后通过&stop传进去以后,strtol函数里面  通过  *(&stop) =非数字字符的地址  ,才能真正的把stop修改掉

试想如果一个int a=1这样的变量  怎么传给一个函数,使函数里面能修改掉变量a 呢    ?
是不是得这样定义    void update(int * v){ *v=2;}   然后通过这样调用函数  update(&a)  ;

所以你说的strtol   也一样啊  ,要修改掉char * stop这样的指针变量   那函数只能定义成char** endptr   ,再外面通过传进去&stop , 所以、明白了吗?
这其实就是老生常谈的问题,要修改掉函数外面的变量,通过传递变量的指针进去。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-4 07:52:34 | 显示全部楼层
看得出差别吗?
#include <stdio.h>

void foo(int** num) {
        ;
}

int main(void) {
        int num = 5; // <--------------- 一个整数
        int* p = num; // <--------------- p 指向 num
        int** q = p; // <--------------- q 指向 p

        foo(&p);
        foo(q);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-4 09:28:37 | 显示全部楼层    本楼为最佳答案   
你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop   把stop传进去,你是这个意思吧。

因为函数里面要给stop指针赋值,使它指向第一个非数字的字符。如果直接传进去一个stop  修改的是stop的副本,没法修改到函数外面的stop变量
只有定义成char** endptr   然后通过&stop传进去以后,strtol函数里面  通过  *(&stop) =非数字字符的地址  ,才能真正的把stop修改掉

试想如果一个int a=1这样的变量  怎么传给一个函数,使函数里面能修改掉变量a 呢    ?
是不是得这样定义    void update(int * v){ *v=2;}   然后通过这样调用函数  update(&a)  ;

所以你说的strtol   也一样啊  ,要修改掉char * stop这样的指针变量   那函数只能定义成char** endptr   ,再外面通过传进去&stop , 所以、明白了吗?
这其实就是老生常谈的问题,要修改掉函数外面的变量,通过传递变量的指针进去。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-5 00:38:31 | 显示全部楼层
xiaotubie 发表于 2022-12-4 09:28
你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop   把stop传进去,你是这 ...

明白了,所以谁指向stop根本不重要,这样子描述是为了让stop指向第一个非法字符,实参是stop的地址。
所以之后要输出后面字符串的话就直接*stop就可以了。
也可以声明一个char **p = &stop;然后第二个参数直接写p就行了,只是那样直接&stop又清晰又方便。
我就是奇怪stop指向第一个非法字符,第二个参数应该是指向stop的,可是我没见他们声明一个指针指向stop。
那这样子它直接把 &stop 给到strtol,这个地址给谁了?函数会自动创建一个临时指针吗,还是根本不需要指针只需要知道这个地址就够了?
感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-5 00:41:05 | 显示全部楼层

感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 18:46:16 | 显示全部楼层
如月ya 发表于 2022-12-5 00:41
感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 13:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表