大裤衩子 发表于 2020-2-7 16:55:27

指针法实现库函数strlen的问题请教

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

#include <stdio.h>
int main(){
char str;
char (*p)=&str;

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

int i;
while(*(p++) != '\0'){
    i++;
}

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

}

大裤衩子 发表于 2020-2-7 16:57:37

本帖最后由 大裤衩子 于 2020-2-7 16:59 编辑

{:10_243:}

大裤衩子 发表于 2020-2-7 17:26:44

代码改了,第10行加上了*,结果还是不对{:10_247:}

#include <stdio.h>
int main(){
char str;
char (*p)=&str;

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

int i;
while(*(*p++) != '\0'){
    i++;
}

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

}

unseenupon 发表于 2020-2-7 17:49:41

本帖最后由 unseenupon 于 2020-2-9 00:41 编辑

第四行代码: char (*p)=&str;
这里换成普通的字符指针 char *p=str;
楼主用二级指针 p 指向这个一维数组,在下面解引用的时候超出数组范围了

最后的魁拔 发表于 2020-2-7 17:59:52

你的i是不是没有初始化

大裤衩子 发表于 2020-2-7 18:00:12

unseenupon 发表于 2020-2-7 17:49
第四行代码: char (*p)=&str;
这里换成普通的字符指针 char *p=str;
然后我把fget函数换成了scanf; ...

按照视频里的说法,普通指针,就是直接指向了数组里首个元素地址,*(p)=str这种办法不就是直接指向整个数组的地址么?{:10_257:}

大裤衩子 发表于 2020-2-7 18:08:16

最后的魁拔 发表于 2020-2-7 17:59
你的i是不是没有初始化

刚刚找到问题,就是i没有初始化引起的{:10_275:}

大裤衩子 发表于 2020-2-7 18:20:52

大裤衩子 发表于 2020-2-7 18:08
刚刚找到问题,就是i没有初始化引起的

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

int main(){
char str;
char (*p)=&str;

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

int i=0;
while(*(*p++) != '\0'){
    i++;
}

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

}

召唤风云 发表于 2020-2-7 18:24:43

你输入abc的时候加上\0试一下。

大裤衩子 发表于 2020-2-7 18:32:57

大裤衩子 发表于 2020-2-7 18:20
i初始化还是不对,逻辑这么简单怎么结果就是不对

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

int main(){
char str;
//char (*p)=&str;
char *p=str;
printf("insert a seq:");
fgets(str,MAX,stdin);

int i=0;
while(*p++ != '\0'){
    i++;
}

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

}

unseenupon 发表于 2020-2-7 18:57:56

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

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

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

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

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

}

大裤衩子 发表于 2020-2-7 20:24:45

unseenupon 发表于 2020-2-7 18:57
也对,忘了这是指向整个数组的地址了...
这样的话把char (*p)=&str 改为 char(*p)=&str
程序也 ...

再追问一句,char (*p)=&str; 改成char (*p)=&str;就错了,为这[]里一定要是1呢?

unseenupon 发表于 2020-2-8 16:45:20

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

我刚刚试了一下,发现不是下标的问题。。而是解引用的位置我调整过了。。
我在下面的代码中解引用是是这样写的; *(*p+i) ; 直接将二级指针p原封不动地解了一层,这样其实也就相当于用了一个简单的指针变量
所以这样的话任意符合规范的数字都可以填在[]里面,我刚试了一下也确实是这样的
页: [1]
查看完整版本: 指针法实现库函数strlen的问题请教