`
paddy.w
  • 浏览: 505065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中strlen方法的陷阱

    博客分类:
  • C
 
阅读更多
        在用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。
分享到:
评论
1 楼 loovejava 2012-09-01  
呵呵
最近也在看C/C++

留意这个问题了。

相关推荐

    C语言面试的陷阱题

    C语言面试中常常会出现一些陷阱题,这些题目旨在测试面试者对C语言基础知识的理解和掌握程度。以下是对一些常见陷阱题目的详细解析: 1. **关于C语言中的函数:** - C语言允许函数的嵌套调用,即在一个函数内部...

    C语言strlen()函数

    在C语言中,`strlen()`函数是一个非常重要的字符串处理函数,它被广泛用于获取字符串的长度。这个函数是C标准库中的一个组成部分,通常在`<string.h>`头文件中声明。下面我们将深入探讨`strlen()`函数的工作原理、...

    超级经典c语言陷阱考试题

    但是,C语言也存在一些易错和易混淆的知识点,这些陷阱经常出现在大学考试和社会招聘考试中。下面我们将总结这些经典的C语言陷阱考试题,帮助考生和程序员更好地备考和备战。 1. 数组元素的地址引用 在C语言中,...

    c语言学习及小游戏

    首先,C语言深入学习阶段为期20周,主要学习资料包括《C缺陷和陷阱》、《C和指针》和《C专家编程》。接下来是编程规范的学习,持续5周,推荐使用华为的《编程规范教程》。最后是15周的Linux程序开发,主要参考...

    C语言编程宝典,一本c语言编程的必备工具书

    理解和操作数组,以及处理字符串函数(如strlen、strcpy、strcat、strcmp等)是C语言编程的基础。 7. **结构体和联合**:结构体允许我们将不同类型的变量组合在一起,而联合则可以共享同一块内存。这些数据结构在...

    C语言库函数 C语言库函数 C语言库函数

    `strlen()` 计算字符串长度,`strcpy()` 和 `strncpy()` 复制字符串,`strcat()` 和 `strncat()` 连接字符串,`strcmp()` 和 `strncmp()` 比较字符串,`strstr()` 查找子字符串,`strchr()` 和 `strrchr()` 找到字符...

    C语言进阶 作者 Wrestle.Wu

    本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...

    c语言几道简单易错题

    这些知识点涵盖了C语言的基础概念和常见陷阱。通过深入理解和实践,初学者可以逐步提高编程能力,避免在实际编程中犯错误。在解题过程中,要时刻注意变量的生命周期、内存管理、类型匹配以及程序的逻辑结构,这样...

    国外最经典的c语言教程

    - 分析常见的编程错误及其解决方法,帮助读者避免常见的陷阱。 - 介绍有效的调试技巧,如使用断点、单步执行、查看变量值等方法来定位和修复错误。 - **扩展阅读资源**: - 推荐其他C语言相关的书籍、网站、论坛...

    清华大学c语言PPT

    8. **标准库函数**:介绍stdio、stdlib、string等标准库中的常用函数,如printf、scanf、strlen等。 9. **编程规范和最佳实践**:编写可读性好、易于维护的代码的重要性,以及一些常见的编程陷阱和如何避免它们。 ...

    c语言坑爹大冒险.rar

    在这个名为"C语言坑爹大冒险"的压缩包中,很可能包含了各种示例代码和练习,用于帮助学习者通过实践来理解和避免这些常见的C语言陷阱。通过学习和解决这些"坑",不仅可以增强编程技能,还能培养解决问题的能力,为...

    C语言大一期末考小助手

    此外,它可能还提供了编程技巧、常见错误分析以及解题策略,帮助你在考试中避免常见陷阱,提高答题效率。 总的来说,掌握C语言不仅能够提升你的编程技能,还能为后续学习其他高级语言打下坚实基础。利用好这个...

    C语言函数库查询手册

    2. **字符串处理**:C语言的`string.h`头文件包含了处理字符串的函数,如`strcpy`用于复制字符串,`strlen`用于计算字符串长度,`strcat`用于连接两个字符串,以及`strcmp`用于比较两个字符串。 3. **内存管理**:`...

    不得不看的100个C语言经典范例

    12. **标准库函数**:如字符串处理函数(strlen、strcpy、strcat等)、数学函数(sqrt、pow等)、输入输出函数(scanf、printf等),都是C语言编程的常用工具。 通过这100个经典范例,学习者不仅可以熟悉C语言的...

    c语言坑爹大冒险.zip

    这个压缩包文件名暗示了在学习C语言过程中可能遇到的一些困难和陷阱。下面,我们将深入探讨C语言中的一些常见问题和知识点。 1. **内存管理**:C语言不提供自动垃圾回收机制,程序员需要手动分配和释放内存。不恰当...

    C语言库函数源码大全

    C语言库函数源码大全是程序员们学习和研究C语言不可或缺的参考资料,它包含了标准库中的上千个函数的源代码。...同时,理解库函数的内部工作原理也有助于避免常见的编程陷阱,编写出更加健壮和高效的C语言程序。

Global site tag (gtag.js) - Google Analytics