sizeof和strlen在C语言中常用来计算字符大小和长度,在应用中却有着本质的区别。
sizeof是C语言中的关键字,其作用是返回一个对象或类型所占的内存字节数。使用方式为:
int i;
sizeof(int); *//值为4*`
sizeof(i); *//值为4,等价于sizeof(int)*
sizeof(2); *//值为4,等价于sizeof(int),因为2的类型为int*
sizeof(2 + 3.14); *//值为8,等价于sizeof(double),因为此表达式的结果的类型为double*
strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0。使用方式为:
char str[30] = "abc defg"; //
printf("strlen(str) = %d \n", strlen(str)); // 带上空格总共8字符
上述为sizeof关键字和strlen函数的基本用法,在实际应用或面试中,应多注意两者区别:
1、sizeof关键字在编译时期就已经确定,stelen函数在运行时期确定。
int a = 1;
printf("%d", sizeof(a++));
printf("%d", a);
上述代码运行结果为4,1。因为sizeof是关键字,所以在第一行输出时a++不会运行,括号内的参数并不会参与计算。这也正证实sizeof关键字在编译时期已经确定,系统认为是常数。
其实上述代码也可作为分辨关键字和函数的区别,当然用指针取址的方法也可分别关键字和函数的区别。
int b = 10;
void* a = &sizeof(b);
这行代码会运行错误,如果sizeof为函数,则指针可指向sizeof的地址,但因为是关键字,取址会导致编译错误。
2、sizeof和strlen的结束符占有大小不同。
sizeof("\0") = 2;
strlen("\0") = 0;
strlen是计算字符串的长度,在C/C++中字符串以“\0”结尾。
sizeof计算操作数的存储大小,“\0”占两字节。
3、strlen返回值为size_t,为无符号整型。
char a[10] = "abcd";
char b[10] = "a";
if (strlen(b) - strlen(a) > 0) {
printf("字符串b 比 字符串a 长 \n");
}
else {
printf("字符串a 比 字符串b 长 \n");
}
上述代表运行结果为“字符串b比 字符串a 长 ”,导致这个输出结果的原因为size_t为无符号整型,所以strlen(b)结果为大于0的数,strlen(a)结果为大于0的数,两个size_t相减也为size_t类型,结果也一定大于0.
4、strlen()定义字符串数组时,一定要初始化。
char test[50]; // 未初始化
printf(" test[] = ");
for (int i = 0; i < 26; i++) {
test[i] = 'A' + i;
printf(" %c ", test[i]);
}
printf("\n stelen(test) = %d \r\n", strlen(test));
上述看到strlen计算出的结果是77,显示是错误的
原因:test字符串在定义时未初始化,test字符串在定义时,拿到一片内存,此时这片内存里面可能储存有值,导致使用strlen计算test字符串时找不到字符串结束标志 ’\0‘,而会在test申请的那片内存后面一直找下去,找到 ’\0‘ 后输出,计算的结果,此时输出的结果肯定错误的结果。
以上为网上资料和个人的一些理解,如有错误,请指正。
资料出处
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称