鱼C论坛

 找回密码
 立即注册
查看: 1210|回复: 12

[已解决]指针法实现库函数strlen的问题请教

[复制链接]
发表于 2020-2-7 16:55:27 | 显示全部楼层 |阅读模式

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

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

x
我的代码如下,结果为啥不对呢,

  1. #include <stdio.h>
  2. int main(){
  3.   char str[100];
  4.   char (*p)[100]=&str;

  5.   printf("insrt a seq:");
  6.   fgets(str,100,stdin);

  7.   int i;
  8.   while(*(p++) != '\0'){
  9.     i++;
  10.   }

  11.   printf("seqlen:%d\n",i);
  12.   return 0;

  13. }
复制代码
最佳答案
2020-2-7 17:49:41
本帖最后由 unseenupon 于 2020-2-9 00:41 编辑

第四行代码: char (*p)[100]=&str;
这里换成普通的字符指针 char *p=str;
楼主用二级指针 p 指向这个一维数组,在下面解引用的时候超出数组范围了
微信截图_20200206193359.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-7 16:57:37 | 显示全部楼层
本帖最后由 大裤衩子 于 2020-2-7 16:59 编辑

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

使用道具 举报

 楼主| 发表于 2020-2-7 17:26:44 | 显示全部楼层
代码改了,第10行加上了*,结果还是不对

  1. #include <stdio.h>
  2. int main(){
  3.   char str[100];
  4.   char (*p)[100]=&str;

  5.   printf("insrt a seq:");
  6.   fgets(str,100,stdin);

  7.   int i;
  8.   while(*(*p++) != '\0'){
  9.     i++;
  10.   }

  11.   printf("seqlen:%d\n",i);
  12.   return 0;

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

使用道具 举报

发表于 2020-2-7 17:49:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 unseenupon 于 2020-2-9 00:41 编辑

第四行代码: char (*p)[100]=&str;
这里换成普通的字符指针 char *p=str;
楼主用二级指针 p 指向这个一维数组,在下面解引用的时候超出数组范围了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 17:59:52 | 显示全部楼层
你的i是不是没有初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 18:00:12 | 显示全部楼层
unseenupon 发表于 2020-2-7 17:49
第四行代码: char (*p)[100]=&str;
这里换成普通的字符指针 char *p=str;
然后我把fget函数换成了scanf; ...

按照视频里的说法,普通指针,就是直接指向了数组里首个元素地址,*(p)[100]=str这种办法不就是直接指向整个数组的地址么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 18:08:16 | 显示全部楼层
最后的魁拔 发表于 2020-2-7 17:59
你的i是不是没有初始化

刚刚找到问题,就是i没有初始化引起的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 18:20:52 | 显示全部楼层
大裤衩子 发表于 2020-2-7 18:08
刚刚找到问题,就是i没有初始化引起的

i初始化还是不对,逻辑这么简单怎么结果就是不对
  1. #include <stdio.h>
  2. #define MAX 100

  3. int main(){
  4.   char str[MAX];
  5.   char (*p)[MAX]=&str;

  6.   printf("insert a seq:");
  7.   fgets(str,MAX,stdin);

  8.   int i=0;
  9.   while(*(*p++) != '\0'){
  10.     i++;
  11.   }

  12.   printf("seqlen:%d\n",i-1); // "减一:fgets会读入\n"
  13.   return 0;

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

使用道具 举报

发表于 2020-2-7 18:24:43 From FishC Mobile | 显示全部楼层
你输入abc的时候加上\0试一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 18:32:57 | 显示全部楼层
大裤衩子 发表于 2020-2-7 18:20
i初始化还是不对,逻辑这么简单怎么结果就是不对

还是改成了,直接指向数组元素首地址,就没有问题了,
  1. #include <stdio.h>
  2. #define MAX 100

  3. int main(){
  4.   char str[MAX];
  5.   //char (*p)[MAX]=&str;
  6.   char *p=str;
  7.   printf("insert a seq:");
  8.   fgets(str,MAX,stdin);

  9.   int i=0;
  10.   while(*p++ != '\0'){
  11.     i++;
  12.   }

  13.   printf("seqlen:%d\n",i-1); // "减一:fgets会读入\n"
  14.   return 0;

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

使用道具 举报

发表于 2020-2-7 18:57:56 | 显示全部楼层
大裤衩子 发表于 2020-2-7 18:00
按照视频里的说法,普通指针,就是直接指向了数组里首个元素地址,*(p)[100]=str这种办法不就是直接指向 ...

也对,忘了这是指向整个数组的地址了...
这样的话把char (*p)[100]=&str 改为 char(*p)[1]=&str
程序也能运行

#include <stdio.h>
int main()
{
    char str[100]={0};
    char (*p)[1]=&str;
    int i=0;
    printf("insrt a seq:");
    scanf("%s", str);

    for(i; *(*p+i)!='\0'; i++);

    printf("seqlen:%d\n",i);
    return 0;

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

使用道具 举报

 楼主| 发表于 2020-2-7 20:24:45 | 显示全部楼层
unseenupon 发表于 2020-2-7 18:57
也对,忘了这是指向整个数组的地址了...
这样的话把char (*p)[100]=&str 改为 char(*p)[1]=&str
程序也 ...

再追问一句,char (*p)[1]=&str; 改成char (*p)[100]=&str;就错了,为这[]里一定要是1呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-8 16:45:20 | 显示全部楼层
大裤衩子 发表于 2020-2-7 20:24
再追问一句,char (*p)[1]=&str; 改成char (*p)[100]=&str;就错了,为这[]里一定要是1呢?

我刚刚试了一下,发现不是下标的问题。。而是解引用的位置我调整过了。。
我在下面的代码中解引用是是这样写的; *(*p+i) ; 直接将二级指针p原封不动地解了一层,这样其实也就相当于用了一个简单的指针变量
所以这样的话任意符合规范的数字都可以填在[]里面,我刚试了一下也确实是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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