鱼C论坛

 找回密码
 立即注册
查看: 1152|回复: 8

[已解决]c语言中strlen

[复制链接]
发表于 2021-11-5 16:57:05 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.         char str1[100] = "abc";
  6.         char str2[100];
  7.         printf("str1 length = %d\n",strlen(str1));
  8.         fgets(str2,1023,stdin);
  9.         printf("str2 length = %d\n",strlen(str2));
  10.         return 0;
  11. }
复制代码


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

看不懂

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

对啊,但是指定读取的字符数超过第一个参数能容纳的最大字符数就有可能造成溢出,可能意外覆盖其他变量值。
gets不安全的原因就是没有像fgets一样的第二个参数,读取多少个字符完全看用户输入多少字符,输入多了就溢出了,程序员控制不了。fgets就是把安全交给程序员把关,所以不要把第二个参数的值设置的比第一个参数的容纳极限还大,否则就跟gets一样不安全了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 17:02:03 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-6 12:04 编辑

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

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

使用道具 举报

发表于 2021-11-6 15:38:21 From FishC Mobile | 显示全部楼层
strlen()函数用来计算指定的字符串的长度,当遇到结束字符'\0'结束,统计输入的个数,'\0'除外。
abc3个,1023是4个,所以是3,4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-6 16:11:01 From FishC Mobile | 显示全部楼层
因为fgets会接收换行符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-6 16:35:52 From FishC Mobile | 显示全部楼层
另外你的fgets用法很有问题啊,第二个参数是让程序员控制fgets的安全性的,不能超过第一个字符数组的大小。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第二个不是指定读取字符数吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-6 19:32:47 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
林江楠 发表于 2021-11-6 19:11
第二个不是指定读取字符数吗

对啊,但是指定读取的字符数超过第一个参数能容纳的最大字符数就有可能造成溢出,可能意外覆盖其他变量值。
gets不安全的原因就是没有像fgets一样的第二个参数,读取多少个字符完全看用户输入多少字符,输入多了就溢出了,程序员控制不了。fgets就是把安全交给程序员把关,所以不要把第二个参数的值设置的比第一个参数的容纳极限还大,否则就跟gets一样不安全了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-6 19:34:48 From FishC Mobile | 显示全部楼层
hrpzcf 发表于 2021-11-6 16:35
另外你的fgets用法很有问题啊,第二个参数是让程序员控制fgets的安全性的,不能超过第一个字符数组的大小。

还有这么回事,可以,学到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-8 21:09:58 | 显示全部楼层
fgets用的有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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