字符串和字符数组
字符串
字符串是 "" 号赋值的
例:
char a[]="hello";//长度为6 最后加了一个 ' \0 '
或
char a[6]="hello";
字符串会自动的在最后加一个'\0'的结束符,
字符数组
字符数组是一个一个的赋值
例:char a[5]={'1','2','3','4','5'};//长度为5 不会自动的加 ' \0 '
关于%s的问题
%s它要求参数是一个指针!!!即: 要求 char * 类型
%s 字符串的格式输出, 它是一个接一个挨着输出, 直到遇见'\0'才中止
当我们用scanf() 用到%s 时 它会自动的在最后加 '\0'
当我们用printf() 用到%s 时 它会一个接一个挨着输出, 直到遇见'\0'才中止
字符越界和出现乱码问题
我们可以看到出现了乱码,这是为何?
首先我们的字符数组里没有 \0 ,而printf() %s 是直到 \0 才结束
这就说明查找 '\0' 越界了, 即乱码 ' 口 ' 之后是 ' \0 '
即: 12345烫蘰 \0
我们的想法对不对呢?
看下图
我们由上图可以看到,没有了乱码。
这是因为scanf() %s 会自动的在最后加 ' \0 '也就是5后面加' \0 ', 即12345后面就是 '\0'
所以没有了乱码。
运行原理如下:
我们再验证一下乱码 '口'之后是不是真的有' \0 '
由上我们可以看出是真的有 ’ \0 '.
通过上面的例子我们可以直到:
也就是说跟定义时分配的空间大小毫无关系了?
不管空间小于字符串长度,还是大于字符串长度,总之只要最后printf()和puts()没有获取到‘\0’
这两个函数就会继续读取给定空间之外的变量,因为这个变量是随机的,不可预知的,所以很多时候就会是乱码。
溢出
我们接着上面的例子:
讲一讲溢出
我们给 a[5] 赋值了这明显溢出了但是确实可以的这是为何 ?
首先,数组越界它并不会造成编译错误!就是说,C,C++的编译器并不判断和指出你的代码“访问越界”了。
一个明明是错误的东西,就这样“顺利”地通过了编译,数组访问越界在运行时,它的表现是不定的,
有时似乎什么事也没有,程序一直运行(当然,某些错误结果已造成);有时,则是程序一下子崩溃。
因此在使用数组时,一定要在编程中判断是否越界以保证程序的正确性。
我们再看一下其他的数组,例:整形数组,实型数组会不会越界出错
由上总结:
再c/c++ 中所有的数组都可以越界,可以运行但是可能会带来一些奇怪的问题
数组越界好比闯红灯,不是每次都会被撞死,但是能不能活下来全赖人品。C语言不会对越界做检查,是否出错,
全看你有没有写入到某个内存地址,这个地址恰好存放重要的数据。
以下就是一个数组越界出现错误的例子