再论strlen sizeof
今天,在使用字符串的时候,对sizeof和strlen的用法更加深入了,特此记录下。
strlen是运行是计算的,不能放在函数外面计算的
sizeof是预编译时运行的,可以放在函数外面计算。
对于char a[]="asdc"这样的定义,sizrof(a)的值是5,因为末尾会自动添加一个'\0',而strlen(a)的值=4,不计算'\0',
对于char a[8]="asdc"这样的定义,sizeof(a)的值是8,因为数组a在定义的时候已经大小定好了,最大就是8,而strlen(a)的值依然=4,不计算'\0',因为在实际内存中,保存的是"asdc\0"。
对于char *a="asdcf"这样的定义,sizrof(a)的值是4(32位系统)或8(64位系统),因为这个a其实是一个指针,指向字符常量。无论后面的字符串多长,都是上面的数值。而strlen(a)的值=5,不计算'\0',其实知道strlen的自定义实现,就知道了strlen含义。
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 
第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。
对于如下定义,month首先是一个数组,但是,但他里面存的是指针,所以说指针数组,所以sizeof(month)的大小是12×8(64位系统)=96;sizeof(month[0])=8,即一个指针的大小。
strlen(month[0]) = 7,即"January"的长度是7,而
strlen(month)无意义,语法非法。编译器报错:warning: assignment from incompatible pointer type
char *month[] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
对于以下定义,month首先是一个一维数组,但是每个子数组中,都是一个字符串,因此是一个二维数组,我这里为每个子数组定义的大小是15,显然,很多数组没有全部用完。所以sizeof(month[0])的大小是15;即一个子数组的大小。
strlen(month[0]) = 7,即"January"的长度是7,
而strlen(month)无意义。编译器报错:expected 'const char *' but argument is of type 'char (*)[15]' _CRTIMP size_t __cdecl __MINGW_NOTHROW strlen (const char*)  __MINGW_ATTRIB_PURE;
char month[][15] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};
再论strlen sizeof的更多相关文章
- c/c++ 常见字符串处理函数总结 strlen/sizeof strcpy/memcpy/strncpy strcat/strncat strcmp/strncmp sprintf/sscanf strtok/split/getline atoi/atof/atol
		
这里总结工作中经常用到的一些c/c++的字符串处理方法,标黑的是使用频率较高的 1.strlen函数:计算目标字符串长度, 格式:strlen(字符指针指向区域) 注意1:①不包含字符串结束 ...
 - strlen sizeof strcat strcpy区别
		
strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...
 - 转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
		
写出如下程序运行结果: #include<stdio.h> #include<string.h> int main() { int a[2000]; char *p = (ch ...
 - C笔试题:将int型数组强制转换为char*,再求strlen,涉及大小端
		
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (ch ...
 - Strcmp(字符串1,字符串2)函数     Sizeof &&  strlen()       Substr(a,b)
		
Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是: i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...
 - sizeof和strlen的区别和联系总结
		
link:http://blog.csdn.net/ghevinn/article/details/9974967 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...
 - 【转载】strlen与sizeof区别
		
自己小结: sizeof使用时,若是数组变量,则是数组变量占的大小 char a[10]; sizeof(a)=10 若是指针,则为指针大小,数组变量作为函数参数传递时,会退化成指针,且函数内是不知道 ...
 - [基础]sizeof和strlen
		
转自网络 首先切记,sizeof不能用来求字符串长度 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字 ...
 - strlen函数细节
		
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: ...
 
随机推荐
- 【转帖】5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个
			
5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个 https://www.laoyaoba.com/html/news/newsdetail?source=pc&news_id=73 ...
 - Hive学习(2)
			
什么是hive Hive是基于Hadoop的一个数据仓库工具(E抽取T转换L加载),可以将结构化的数据文件映射为一张表,并提供类SQL查询功能 hive的处理流程 ()将HQL语句转化为一组操作符 ( ...
 - AVR单片机教程——拨动开关
			
在按键的上方有4个拨动开关.开关与按键,在原理和使用方法上都是很类似的,但有不同的用途——按键按下后松开就会弹起,而开关可以保存其状态. <switch.h> 定义了与开关相关的函数.sw ...
 - logrus 剖析之滚动日志
			
在实际开发过程中,为了节省磁盘,日志需要按照时间或者大小维度进行切割分成多分,归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(log rotation) 那么在 logrus ...
 - vim实用操作指南
			
一.查看文件编码 :set fileencoding :set fileencoding=utf-8 通过该命令可直接将文件修改为UTF-8编码 强制以指定编码打开,vim中 :e ++enc=utf ...
 - .net语音播放,自定义播报文字
			
// using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer(); // Configure th ...
 - IIS配置文件的XML格式不正确 applicationHost.config崩溃
			
错误提示如图: 检查C:\Windows\System32\inetsrv\config目录下的applicationHost.config文件,备份一份. 可使用IIS提供的AppCmd.exe的r ...
 - WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题
			
前端使用的是elementui的日期控件,将日期格式的数据提交到webapi后台时,接收到的日期格式少了8小时,这个原因是由于时区引起的,应该在WebApiConfig进行配置转成本地时间,解决少8小 ...
 - Core 导出(流和URL两种)
			
1.流 2.URL 两种都是使用Epplus 1. EPPlus的基本介绍 EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组 ...
 - NIO开发Http服务器(2):项目结构
			
最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...