| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1122 人关注过本帖
标题:刚看到有同学提问计算字符串的长度,实际测试了一下,发现有2个数据理解不了 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:20 回复次数:13 
刚看到有同学提问计算字符串的长度,实际测试了一下,发现有2个数据理解不了呢
程序代码:
#include<stdio.h>
#include<string.h>


int main()
{
    char   *str1 ="abcdefg";
    char  str2[] ="abcdefg";
    char  str3[7]={'a','b','c','d','e','f','g'};
    int len1=sizeof str1/sizeof(char);
    int len2=sizeof str2/sizeof(char);
    int len3=sizeof str3/sizeof(char);
    printf("str1 of len=%d str2 of len2=%d str3 of len3=%d\n",len1,len2,len3);
    int _len1 =(int)strlen(str1);
    int _len2 =(int)strlen(str2);
    int _len3 =(int)strlen(str3);
    printf("str1 of len=%d str2 of len2=%d str3 of len3=%d\n",_len1,_len2,_len3);
    return 0;
}



/*
样例输出:
    str1 of len=4 str2 of len2=8 str3 of len3=7
    str1 of len=7 str2 of len2=7 str3 of len3=15

*/
比较特殊的 4 =指针的长度  这没问题  3个长度为7的也没问题
那个 8 和 15  是 怎么回事 ?
搜索更多相关主题的帖子: 计算 测试 字符串 color 
2012-12-13 11:24
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:7 
int len1=sizeof str1/sizeof(char);
    int len2=sizeof str2/sizeof(char);
    int len3=sizeof str3/sizeof(char);
版主你的sizeof怎么没括号?

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-13 11:49
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:7 
char  str2[] ="abcdefg";              str2 of len2=8
str2[]和*str1不同,前者是数组。后者是指针,后者打印出来4没问题,前者是个没有定义长度的数组,默认以strlen(str2)+1为长度,也就是sizeof(str)了,+1是因为字符串以'\0'结尾,也算一个字符,故此数组长度为8


char  str3[7]={'a','b','c','d','e','f','g'};      str3 of len3=15
很明显,数组所有元素都是非'\0'字符,没有结束符'\0',数组越界访问,至于打印出来是多少,为什么会这样,是编译器的事,在这里是15
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 小小战士 于 2012-12-13 11:56 编辑 ]

小小战士,战士中的战斗机!
2012-12-13 11:55
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
8好像是楼主没有申明字符串str2的大小,系统在串的最后加了'\0'作为结束标志,这个标志本身也是串的一部分,所以得8

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-13 11:55
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:7 
char  str2[] = "abcdefg";
int nLen2 = sizeof(str2); //当前字符串的长度 + (1字节长度)'\0'. => 8
int nLen2 = strlen(str2); //当前字符串的长度. => 7


图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册


字符串遇到'\0' 视为当前字符串结尾
如下图
int nLen3 = strlen(str3); //当前字符串的长度. => 15

图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册


因为
char  str3[7]={'a','b','c','d','e','f','g'}; 最后没有'\0'结尾
修改为
char  str3[8]={'a','b','c','d','e','f','g'};


2012-12-13 11:55
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
那就是说 求字符串数组的长度 还是 库函数strlen比较靠谱

DO IT YOURSELF !
2012-12-13 12:00
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yaobao在2012-12-13 11:49:46的发言:

int len1=sizeof str1/sizeof(char);
    int len2=sizeof str2/sizeof(char);
    int len3=sizeof str3/sizeof(char);
版主你的sizeof怎么没括号?
加不加 都可  要不 自己试试先

DO IT YOURSELF !
2012-12-13 12:01
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
15原来是这么回事,呃呃呃,我想起来了,我听过一公开课,说c里的数组都没有边境的检测,发生越界访问时,系统会按内存的顺序往下找,举个例子来说,定义了int a[2];如果你给a[2]赋值那么明显越界了,系统会把a[1]后的4个字节赋值为1,而不返回越界提示。当访问数组越界时也不会提示,系统自动找到他认为合理的字节的内容返回给你,哪怕你访问的是数组首地址以前的字节也不会返回错误信息。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-13 12:04
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
回复 7楼 wp231957
真没试过不加括号,,,,,呵呵

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-13 12:06
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
这就涉及这两个库函数实现的机理了
据我所知strlen函数是用指针实现的,遇到'\0'就停止计数返回退出
sizeof是一个运算符,再具体的说是一个宏定义,通过地址相减来实现的,所以什么类型的就得到相应的大小
#define SIZEOF(x)     
 ({ typeof (x) _x;      
 (char *)((&_x+1)) - (char *)(&_x);})

小小战士,战士中的战斗机!
2012-12-13 12:09
快速回复:刚看到有同学提问计算字符串的长度,实际测试了一下,发现有2个数据理 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044091 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved