在用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。
分享到:
相关推荐
C语言面试中常常会出现一些陷阱题,这些题目旨在测试面试者对C语言基础知识的理解和掌握程度。以下是对一些常见陷阱题目的详细解析: 1. **关于C语言中的函数:** - C语言允许函数的嵌套调用,即在一个函数内部...
在C语言中,`strlen()`函数是一个非常重要的字符串处理函数,它被广泛用于获取字符串的长度。这个函数是C标准库中的一个组成部分,通常在`<string.h>`头文件中声明。下面我们将深入探讨`strlen()`函数的工作原理、...
但是,C语言也存在一些易错和易混淆的知识点,这些陷阱经常出现在大学考试和社会招聘考试中。下面我们将总结这些经典的C语言陷阱考试题,帮助考生和程序员更好地备考和备战。 1. 数组元素的地址引用 在C语言中,...
首先,C语言深入学习阶段为期20周,主要学习资料包括《C缺陷和陷阱》、《C和指针》和《C专家编程》。接下来是编程规范的学习,持续5周,推荐使用华为的《编程规范教程》。最后是15周的Linux程序开发,主要参考...
理解和操作数组,以及处理字符串函数(如strlen、strcpy、strcat、strcmp等)是C语言编程的基础。 7. **结构体和联合**:结构体允许我们将不同类型的变量组合在一起,而联合则可以共享同一块内存。这些数据结构在...
`strlen()` 计算字符串长度,`strcpy()` 和 `strncpy()` 复制字符串,`strcat()` 和 `strncat()` 连接字符串,`strcmp()` 和 `strncmp()` 比较字符串,`strstr()` 查找子字符串,`strchr()` 和 `strrchr()` 找到字符...
本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...
这些知识点涵盖了C语言的基础概念和常见陷阱。通过深入理解和实践,初学者可以逐步提高编程能力,避免在实际编程中犯错误。在解题过程中,要时刻注意变量的生命周期、内存管理、类型匹配以及程序的逻辑结构,这样...
- 分析常见的编程错误及其解决方法,帮助读者避免常见的陷阱。 - 介绍有效的调试技巧,如使用断点、单步执行、查看变量值等方法来定位和修复错误。 - **扩展阅读资源**: - 推荐其他C语言相关的书籍、网站、论坛...
8. **标准库函数**:介绍stdio、stdlib、string等标准库中的常用函数,如printf、scanf、strlen等。 9. **编程规范和最佳实践**:编写可读性好、易于维护的代码的重要性,以及一些常见的编程陷阱和如何避免它们。 ...
在这个名为"C语言坑爹大冒险"的压缩包中,很可能包含了各种示例代码和练习,用于帮助学习者通过实践来理解和避免这些常见的C语言陷阱。通过学习和解决这些"坑",不仅可以增强编程技能,还能培养解决问题的能力,为...
此外,它可能还提供了编程技巧、常见错误分析以及解题策略,帮助你在考试中避免常见陷阱,提高答题效率。 总的来说,掌握C语言不仅能够提升你的编程技能,还能为后续学习其他高级语言打下坚实基础。利用好这个...
2. **字符串处理**:C语言的`string.h`头文件包含了处理字符串的函数,如`strcpy`用于复制字符串,`strlen`用于计算字符串长度,`strcat`用于连接两个字符串,以及`strcmp`用于比较两个字符串。 3. **内存管理**:`...
12. **标准库函数**:如字符串处理函数(strlen、strcpy、strcat等)、数学函数(sqrt、pow等)、输入输出函数(scanf、printf等),都是C语言编程的常用工具。 通过这100个经典范例,学习者不仅可以熟悉C语言的...
这个压缩包文件名暗示了在学习C语言过程中可能遇到的一些困难和陷阱。下面,我们将深入探讨C语言中的一些常见问题和知识点。 1. **内存管理**:C语言不提供自动垃圾回收机制,程序员需要手动分配和释放内存。不恰当...
C语言库函数源码大全是程序员们学习和研究C语言不可或缺的参考资料,它包含了标准库中的上千个函数的源代码。...同时,理解库函数的内部工作原理也有助于避免常见的编程陷阱,编写出更加健壮和高效的C语言程序。