鱼C论坛

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

strlen()

[复制链接]
发表于 2015-3-28 13:20:11 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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[100],b[100],*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!



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[100] = "http://see.xidian.edu.cn/cpp/u/shipin_liming/";
    char str3[5] = "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???

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

原来strlen() ,不能计算不含0 ,结尾的字符串;
想知道小甲鱼最近在做啥?请访问 -> 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。       本人知识有限,以上解答为本人的理解,如果有错,请见谅。
想知道小甲鱼最近在做啥?请访问 -> 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)  ,程序进入死循环?   这个问题跟上面一样,都是逻辑出错,肯定会死循环啊。
想知道小甲鱼最近在做啥?请访问 -> 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),返回一个正数)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

行吧,你懂就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-16 15:24:32 | 显示全部楼层
感觉你的程序代码有点问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 08:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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