字符串和字符数组

字符串

字符串是 "" 号赋值的
例:
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语言不会对越界做检查,是否出错,
全看你有没有写入到某个内存地址,这个地址恰好存放重要的数据。
以下就是一个数组越界出现错误的例子

在这里插入图片描述
数组越界问题

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值