鱼C论坛

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

strlen()

[复制链接]
发表于 2015-3-28 13:20:11 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 haiouda 于 2015-3-28 18:12 编辑
  1. /****************************************************************************************************
  2. 有一个字符串,包含 n 个字符。写一个函数,将此字符串中从第 m 个字符开始的全部字符复制成为另一个字符串;
  3. *****************************************************************************************************/

  4. #if(1)
  5. #include<stdio.h>
  6. #include<string.h>



  7. int main()
  8. {
  9.         char *xd(char *p,char *u,int k);
  10.         char a[100],b[100],*t;
  11.         int m;
  12.         printf("输入一个字符串:");
  13.         gets(a);
  14.         printf("输入一个整数:m=");
  15.         scanf("%d",&m);

  16.     while (strlen(a)<m)
  17.         {
  18.                 printf("输入错误!请重新输入:m=");
  19.         scanf("%d",&m);
  20.         }
  21.                                                 
  22.         t=xd(a,b,m);
  23.         
  24.         printf("%s\n",a);
  25.         
  26.         printf("%s\n",b);
  27.         
  28.         printf("%s\n",t);
  29.         
  30.         
  31.         return 0;
  32. }
  33. char *xd(char *p,char *u,int k)
  34. {
  35.         int i=0;
  36.         
  37.         while(*(p+k)!=0)
  38.         {
  39.                 *u=*(p+k);
  40.                 p++;u++;i++;        
  41.         }
  42.         *u=0;
  43.         
  44.         return (u-i);
  45.         
  46.         
  47. }




  48. #endif
复制代码
第21行,改为: while (strlen(a)-m<0) ,程序变会出错,为何?(这个和下面的循环条件,在数学上明明是相等的)

把21行,改为: while ( m-strlen(a) >0)  ,程序进入死循环?如果理解为,由于输入的m使循环条件一直成立,所以死循环,那么上面的怎么解释?
如果象上面,21行那样子,又会有警告,又是为什么?
以上我的输入字符串为:I love you!



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-28 13:40:58 | 显示全部楼层

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.     char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/";
  6.     char str2[100] = "http://see.xidian.edu.cn/cpp/u/shipin_liming/";
  7.     char str3[5] = "12345";
  8.     printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1));
  9.     printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2));
  10.     printf("strlen(str3)=%d, sizeof(str3)=%d\n", strlen(str3), sizeof(str3));
  11.     return 0;
  12. }
复制代码

第三行输出为何 是 53???

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-28 13:45:40 | 显示全部楼层
haiouda 发表于 2015-3-28 13:40
第三行输出为何 是 53???

原来strlen() ,不能计算不含0 ,结尾的字符串;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-28 17:11:53 | 显示全部楼层
haiouda 发表于 2015-3-28 13:40
第三行输出为何 是 53???

根据你提供的代码,char str3[5] = "12345";这一行运行是会报错的,超出了数据范围,溢出。如果是char str3[5] = "1234";这样就刚刚好,因为定义str3[5]是5个位置,所以1234+“\n”刚刚好,"\n"是隐藏的。strlen(str3), sizeof(str3));  第一个打印出来是这个字符串里面的字符个数,有4个,第二个是打印出str3[5]的大小,所以是5。       本人知识有限,以上解答为本人的理解,如果有错,请见谅。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-28 17:17:38 | 显示全部楼层
第21行,改为: while (strlen(a)-m<0) ,程序变会出错,为何?  你觉得有可能出现当strlen(a)-m会小于0 的情况出现么?最多也就是等于0,改成 while (strlen(a)-m<=0) 就对了。
把21行,改为: while ( m-strlen(a) >0)  ,程序进入死循环?   这个问题跟上面一样,都是逻辑出错,肯定会死循环啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-28 17:36:11 | 显示全部楼层
ANDES 发表于 2015-3-28 17:17
第21行,改为: while (strlen(a)-m

首先 strlen(a),肯定会返回一个大正数(),因为前面字符串a 有输入且a 字符串用gets()函数输入,所以字符串a ,是个完整的字符串(以0结尾)。

所以下面:
while (strlen(a)-m<0) ,这里m是任意输入的,所以 strlen(a)-m<0 ,是可以出现的呀!

把它当做条件,放在whiel()里当条件,最多是死循环才对呀!
改为: while ( m-strlen(a) >0) ;这里,同上,也看不到错误呀??(strlen(a),返回一个正数)


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-3-28 17:39:01 | 显示全部楼层
haiouda 发表于 2015-3-28 17:36
首先 strlen(a),肯定会返回一个大正数(),因为前面字符串a 有输入且a 字符串用gets()函数输入,所以字 ...

行吧,你懂就行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-8-16 15:24:32 | 显示全部楼层
感觉你的程序代码有点问题啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-8-23 00:44:36 | 显示全部楼层
楼主 你的题问题和我在另外一贴中看到的是同一个问题,回复情况是一样的 http://bbs.fishc.com/thread-59789-1-1.html到这个 链接查看结果吧,希望你能有所收获!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 20:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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