haiouda 发表于 2015-3-28 13:20:11

strlen()

本帖最后由 haiouda 于 2015-3-28 18:12 编辑

/****************************************************************************************************
有一个字符串,包含 n 个字符。写一个函数,将此字符串中从第 m 个字符开始的全部字符复制成为另一个字符串;
*****************************************************************************************************/

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



int main()
{
      char *xd(char *p,char *u,int k);
      char a,b,*t;
      int m;
      printf("输入一个字符串:");
      gets(a);
      printf("输入一个整数:m=");
      scanf("%d",&m);

    while (strlen(a)<m)
      {
                printf("输入错误!请重新输入:m=");
      scanf("%d",&m);
      }
                                                
      t=xd(a,b,m);
      
      printf("%s\n",a);
      
      printf("%s\n",b);
      
      printf("%s\n",t);
      
      
      return 0;
}
char *xd(char *p,char *u,int k)
{
      int i=0;
      
      while(*(p+k)!=0)
      {
                *u=*(p+k);
                p++;u++;i++;      
      }
      *u=0;
      
      return (u-i);
      
      
}




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

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



haiouda 发表于 2015-3-28 13:40:58


#include<stdio.h>
#include<string.h>
int main()
{
    char *str1 = "http://see.xidian.edu.cn/cpp/u/shipin/";
    char str2 = "http://see.xidian.edu.cn/cpp/u/shipin_liming/";
    char str3 = "12345";
    printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1));
    printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2));
    printf("strlen(str3)=%d, sizeof(str3)=%d\n", strlen(str3), sizeof(str3));
    return 0;
}
第三行输出为何 是 53???

haiouda 发表于 2015-3-28 13:45:40

haiouda 发表于 2015-3-28 13:40
第三行输出为何 是 53???

原来strlen() ,不能计算不含0 ,结尾的字符串;

ANDES 发表于 2015-3-28 17:11:53

haiouda 发表于 2015-3-28 13:40
第三行输出为何 是 53???

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

ANDES 发表于 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),程序进入死循环?   这个问题跟上面一样,都是逻辑出错,肯定会死循环啊。

haiouda 发表于 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),返回一个正数)


ANDES 发表于 2015-3-28 17:39:01

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

行吧,你懂就行。

醉酒青牛2011 发表于 2015-8-16 15:24:32

感觉你的程序代码有点问题啊

默默路过 发表于 2015-8-23 00:44:36

楼主 你的题问题和我在另外一贴中看到的是同一个问题,回复情况是一样的 http://bbs.fishc.com/thread-59789-1-1.html到这个 链接查看结果吧,希望你能有所收获!
页: [1]
查看完整版本: strlen()