c语言输出笑脸('\1')

c语言输出笑脸(’\1’)

参考博客strlen()函数的实现原理

这里写图片描述

就如上图,在程序编译执行之后,输出了笑脸符号,可是在别人的电脑中又没有显示出这个错误。也就是说同样的代码,同样的编译器,却显示不同的内容。
- 笑脸:’\1’ (有的编译器是显示空格或者一个正方形框)
- 缩写/字符:SOH(start of headline)
- 解释:标题开始
经过google,发现是因为strlen函数的原理导致了这种数值溢出的现象。

strlen函数的实现原理类似这个:

    #include <stdlib.h>
    size_t strlen( char *string )
    {
        int length = 0;
        // 依次访问字符串的内容,计算字符数,直至遇到NUL终止符
        while( *string++ != '\0' )
            length += 1;
        return length;
    }

两点注意:

  • size_t 为stddef.h中定义的数据类型,等价于 unsigned int,它的取值必须大于等于0。
  • while()循环条件中,string++等价于(string++)。string是指针变量,保存的是字符串的起始地址(第一个字符的地址),地址是一个整数,可以进行算术运算,加 1 后为下一个字符的地址。

在指针到达字符串末尾的NUL字节之前,while语句中*string++表达式的值一直为真。它同时增加指针的值,用于下一次测试。这个表达式甚至可以正确地处理空字符串。

如果这个函数调用时传递给它的是一个NULL指针,那么while语句中的间接访问将会失败。函数是不是应该在解引用指针前检查这个条件?从绝对安全的角度讲,应该如此。但是,这个函数并不负责创建字符串。如果它发现参数为NULL,它肯定发现了一个出现在程序其他地方的错误。 当指针创建时检查它是否有效是合乎逻辑的,因为这样只需检查一次。这个函数采用的就是这种方 法。如果函数失败是因为粗心大意的调用者懒得检查参数的有效性而引起的,那是他活该如此。

所以,使用strlen()函数之前一定要确保字符串不为NULL。而字符串的存储方式跟一个char型数组类似。

所以在用strlen函数的时候,要确保该数组或者字符串有结束标志’\0’

不同电脑不同输出没搞懂,希望能有留言解答一下我的疑惑~

发布了35 篇原创文章 · 获赞 44 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章