C语言关与数组的输入输出函数

来源:百度知道 编辑:UC知道 时间:2024/05/18 18:42:27
程序:
#include <stdio.h>
void main()
{
char c[10];
scanf("%s",c);
printf("%s",c);
}
不是定义输入10个字符,可是输入十二个字符,也可输出十二个字符???
图片如下:

向字符数组c中输入字符串,它是这样存储的:
将字符串中的第一个字符赋给字符数组的第一个元素c[0],第二个字符赋给第二个元素c[1],以此类推。

需要注意的是,当给c[9]赋过值之后,如果在字符串中还有剩余的字符,程序会继续命令指针从c[9]处继续向后移动一个存储单元的长度(在这里就是一个字节的长度),并在读入一个字符并赋给紧挨着c[9]的那个存储单元,形象一点儿,把它叫做c[10],以此类推,直到读完所输入的字符串中的所有字符,并自动加赋'\0'。

这种输入方式一般也能运行,但是这是十分危险的。因为紧挨在c[9]后面的单元中的内容是不可预料的,它可能是一个空白的存储空间,也可能已经存放了一个十分有用的数据。如果存储的是一个有用的数据,越界输入就会把越界部分原先已有的数据覆盖掉。

在程序比较小的时候,由于空白地带比较多,程序往往可以正常运行,但是当程序的规模很大的时候,一旦越界输入,(越界部分)有用数据被覆盖掉的可能性就很大了。

最好的方法就是使用scanf("%10s", c); 以限制向字符数组中输入字符的个数。

你可能会把堆栈写坏。
堆栈上只分配了10个字符的空间给这个数组,C语言不检查数组是否越界,所以你输入多少都无所谓。

简单的程序可能可以通过。但是复杂程序就不行了。

建议你以后一直这样使用scanf:
scanf("%10s", c);
最大接受10个字符,剩下的继续放在stdin流里面。
这样可以避免缓冲区溢出。代码是安全的。

没错,就是这样设计的,C语言不会管你的数组是否越界,而是简单地顺序往下存。这是不推荐的用法,容易覆盖掉其他有用的数据

你说的这种情况就是字符数组益出情况,当你以%s输入的时候,计算机是这样分配内存的,以数组的首地址开始往后存储,一直到你输入回车为止,系统才能自动在数组的末尾加上“\0”作为结束标记,当你输出时候也是从首地址开始往后面输出字符,直到有“\0”时候才结束,所以才出现输入多少,输出多少的情况。然而这是C语言语法上的错