林江楠 发表于 2021-11-5 16:57:05

c语言中strlen

#include <stdio.h>
#include <string.h>

int main(void)
{
        char str1 = "abc";
        char str2;
        printf("str1 length = %d\n",strlen(str1));
        fgets(str2,1023,stdin);
        printf("str2 length = %d\n",strlen(str2));
        return 0;
}

输入abc打印结果一个是3,一个是4

看不懂

jhq999 发表于 2021-11-5 17:02:03

本帖最后由 jhq999 于 2021-11-6 12:04 编辑


char str1 = "abc";
//str1='a',str1='b',str1='c',str1='\0';
fgets(str2,1023,stdin);//abc
//str2='a',str2='b',str2='c',str2='\n',str2='\0';其实设一个断点就知道怎么回事,我早就忘了这个函数,刚才运行一下,设个断点,查看str2里的内容才知道

yzzc 发表于 2021-11-6 15:38:21

strlen()函数用来计算指定的字符串的长度,当遇到结束字符'\0'结束,统计输入的个数,'\0'除外。
abc3个,1023是4个,所以是3,4

hrpzcf 发表于 2021-11-6 16:11:01

因为fgets会接收换行符。

hrpzcf 发表于 2021-11-6 16:35:52

另外你的fgets用法很有问题啊,第二个参数是让程序员控制fgets的安全性的,不能超过第一个字符数组的大小。

林江楠 发表于 2021-11-6 19:11:27

hrpzcf 发表于 2021-11-6 16:35
另外你的fgets用法很有问题啊,第二个参数是让程序员控制fgets的安全性的,不能超过第一个字符数组的大小。

第二个不是指定读取字符数吗

hrpzcf 发表于 2021-11-6 19:32:47

林江楠 发表于 2021-11-6 19:11
第二个不是指定读取字符数吗

对啊,但是指定读取的字符数超过第一个参数能容纳的最大字符数就有可能造成溢出,可能意外覆盖其他变量值。
gets不安全的原因就是没有像fgets一样的第二个参数,读取多少个字符完全看用户输入多少字符,输入多了就溢出了,程序员控制不了。fgets就是把安全交给程序员把关,所以不要把第二个参数的值设置的比第一个参数的容纳极限还大,否则就跟gets一样不安全了。

林江楠 发表于 2021-11-6 19:34:48

hrpzcf 发表于 2021-11-6 16:35
另外你的fgets用法很有问题啊,第二个参数是让程序员控制fgets的安全性的,不能超过第一个字符数组的大小。

还有这么回事,可以,学到了

那兔Wzbxxxxxl 发表于 2021-11-8 21:09:58

fgets用的有问题
页: [1]
查看完整版本: c语言中strlen