2020.3.15 第三次作业
一、学习笔记
学习范围:8.2.2 动态内存分配,8.3.1 单字符输入输出,8.3.2 字符串数组,8.4.1 函数strlen,8.4.2 函数strcmp,8.4.3 函数strcpy,8.4.4 字符串中找字符
二、相关程序
三、存在问题
1.什么是行编辑?
答:一行行接受用户从终端输入的程序或数据,并存入用户的数据区
2.什么是‘shell’?
答:shell就是在操作系统和应用程序之间的一个命令翻译工具。
3.什么是缓冲区?
答:缓冲区又称为缓存,是内存空间的预留部分,主要用来缓冲输入或输出的数据,根据其对应的是输入还是输出设备,分为输入缓冲区和输出缓冲区。
4.下面描述正确的是 ( D )
解析:字符串按照顺序依次比较,如果碰到不相等的,则进行相减,得出结果,反之则得0。
5.假设scanf
语句执行时输入ABCDE
<回车>,能使puts(s)
语句正确输出ABCDE
字符串的程序段是( D )
此题正确选项是D,但是A和B在编译器中运行时确实能够打印出ABCDE,那么A和B为何不正确那?
答:A和B中字符的定义都是字符数组的形式,并不是字符串,即末尾都没有‘\0’, 非字符串使用字符串函数puts来输出是不正确的。
但是为何A和B这两种情况反倒能输出正确结果那,这就涉及到存储中的边界对齐存储的知识了:
一个字节是8个字符,如果字符数组长度是小于8个,比如例题中的5个,那么因为边界对齐存储原因,该字节中只存放5个字符,剩下的3个字符都为0,使用puts函数输出字符数组时,就会把后面的0识别为‘\0’。而当数组长度是8或者8的倍数时,puts函数找不到后面的0,打印就会出现问题。
如果我们将数组改为8个元素,那么后面的\0就需要读取下一个字节中的数据了,对于长度为8个元素或者8的倍数的字符数组使用puts函数,结果就不正确了。