C语言关与数组的输入输出函数
发布网友
发布时间:2023-03-07 17:26
我来回答
共4个回答
热心网友
时间:2023-10-30 22:25
向字符数组c中输入字符串,它是这样存储的:
将字符串中的第一个字符赋给字符数组的第一个元素c[0],第二个字符赋给第二个元素c[1],以此类推。
需要注意的是,当给c[9]赋过值之后,如果在字符串中还有剩余的字符,程序会继续命令指针从c[9]处继续向后移动一个存储单元的长度(在这里就是一个字节的长度),并在读入一个字符并赋给紧挨着c[9]的那个存储单元,形象一点儿,把它叫做c[10],以此类推,直到读完所输入的字符串中的所有字符,并自动加赋'\0'。
这种输入方式一般也能运行,但是这是十分危险的。因为紧挨在c[9]后面的单元中的内容是不可预料的,它可能是一个空白的存储空间,也可能已经存放了一个十分有用的数据。如果存储的是一个有用的数据,越界输入就会把越界部分原先已有的数据覆盖掉。
在程序比较小的时候,由于空白地带比较多,程序往往可以正常运行,但是当程序的规模很大的时候,一旦越界输入,(越界部分)有用数据被覆盖掉的可能性就很大了。
最好的方法就是使用scanf("%10s", c); 以*向字符数组中输入字符的个数。
热心网友
时间:2023-10-30 22:25
你可能会把堆栈写坏。
堆栈上只分配了10个字符的空间给这个数组,C语言不检查数组是否越界,所以你输入多少都无所谓。
简单的程序可能可以通过。但是复杂程序就不行了。
建议你以后一直这样使用scanf:
scanf("%10s", c);
最大接受10个字符,剩下的继续放在stdin流里面。
这样可以避免缓冲区溢出。代码是安全的。
热心网友
时间:2023-10-30 22:25
没错,就是这样设计的,C语言不会管你的数组是否越界,而是简单地顺序往下存。这是不推荐的用法,容易覆盖掉其他有用的数据
热心网友
时间:2023-10-30 22:26
你说的这种情况就是字符数组益出情况,当你以%s输入的时候,计算机是这样分配内存的,以数组的首地址开始往后存储,一直到你输入回车为止,系统才能自动在数组的末尾加上“\0”作为结束标记,当你输出时候也是从首地址开始往后面输出字符,直到有“\0”时候才结束,所以才出现输入多少,输出多少的情况。然而这是C语言语法上的错误的,因为如果超出了界限的话,可能把内存中很重要的东西覆盖掉了,很危险的!