在用strlen时遇到挺郁闷的问题,用strlen求字符数组的长度时总是不对,google了一下才发现忽略了其中的一些细节。
int main() {
char a[5]="AABCD";
char b[4]="CDAA";
int len = strlen(a);
printf("%d\n",len);
}
在我的机器上执行结果总是26,但明显应该是5,why?看了下strlen的源码才明白,strlen判断字符串长度时是以'\0'为界的,也即strlen碰到'\0'时才会认为字符串结束了。
我们知道,字符串常量是以'\0'为结尾的,而上面将字符串常量“AABCD”赋给a数组时,恰恰丢掉了结尾的'\0',以至于判断到'D'的下一位发现不是'\0'进而继续判断。所以,在判断字符串常量时是不会出错的,若非要判断字符数组的长度,就需要注意了。
这其中还有一个陷阱,看下面的语句:
int main() {
char *s = "hello";
int len = strlen(s);
printf("%d\n",len);
printf("%d\n",strlen(s)-7);
printf("%ud\n",strlen(s)-7);
printf("%d\n",strlen(s)>7);
printf("%d\n",strlen(s)-7>0);
}
在我机器上的执行结果如下:
5
-2
4294967294d
0
1
可能在最后的两个结果有疑问,这种逻辑放在平常感觉没什么不一样,这里为什么会不一致呢?看一下strlen的原型也就明白了
size_t strlen(const char *string);
其中在string.h中说明了size_t是在stddef.h中定义的。我机器的stddef.h中定义size_t为无符号整型,而无符号与有符号的运算结果还是无符号的。这也就解释了为什么最后一个结果判断为真,因为-2的无符号整型值大于0。
分享到:
相关推荐
strlen
【C语言】strlen()函数
问题描述:编写一个c语言函数strlen,要求在其中不能够使用任何的变量思路:如果在函数体重不能使用变量,同时考虑到斐波那契数列的递归求解的过程,可以联想到使用
c语言本身有strlen函数,这个是利用递归自己写的
主要介绍了C语言中strlen() strcpy() strcat() strcmp()函数的实现方法,需要的朋友可以参考下
C 库函数 - strlen() C 标准库 - 描述 C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。 声明 下面是 strlen() 函数的声明。 size_t strlen(const ...
C语言中strcpy_strcmp_strlen_strcat函数原型
c语言strlen转义字符,转义字符 & sizeof & strlen-CSDN博客.mhtml
C语言strlen()函数:返回字符串的长度 头文件: #include strlen()函数用来计算字符串的长度,其原型为: unsigned int strlen (char *s); 【参数说明】s为指定的字符串。 strlen()用来计算指定的字符串s 的...
该文档包涵了多个C语言中的对于字符串的处理函数,同时也是这些函数的还原
c/c++:strlen源码
编写一个程序,求字符串的长度,不能使用strlen函数。 (代码提示:i=0;while(s[i]!= '\0')i++; 则最后i的值就是字符串长度)
本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...
主要介绍了C语言中sizeof()与strlen()函数的使用入门及对比,同时二者在C++中的使用情况也基本上同理,是需要的朋友可以参考下
本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...
C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF...
1. sizeof()【操作数所占空间的字节数大小】是一种c中的基本运算符。 可以以类型、指针、数组和函数等作为参数。 头文件类型为unsigned int。 运算值在编译的时候就出结果,所以可以用来定义数组维数。 char a[5]=...
标准函数库itoa和strlen的实现,C语言源码 学习自己实现数值转字符itoa函数和求字符串长度strlen函数
1、编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小。sizeof后若是类型必须...2、运行时计算strlen,只能用char*做参数,且必须是以”\0”结尾的。计算的是字符串的长度。如: 代码如下: char str