遇到不懂的,摘抄了好的文章

凉面小五 凉面小五     2022-08-22     424

关键词:

一、getchar的两点总结:
1.  getchar是以行为单位进行存取的。
    当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z,Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符′ ′(也可以是文件结束符EOF,EOF将在后面讨论)时,getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:
while((c = getchar()) != EOF)
{
    putchar(c);
}

执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。

    对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。
 
    对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF(Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。
    这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:
char c;
c = getchar();
    这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):
int c;
c = getchar();

二、EOF的两点总结
1.EOF作为文件结束符时的情况:
  EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。
(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;
(2)在前面输入的字符为换行符时,接着输入Ctrl+D;
(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的Ctrl+D的作用将在下面介绍。
  其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。

2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。
   这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:
abcabc
 注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。

如果输入abc之后,然后回车,输入换行符的话,则终端显示为:
abc     //第一行,带回车
abc     //第二行
        //第三行
其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。
从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。

EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。

聊天机器人有了长期记忆,遇到不懂的还能上网搜索,网友:像极了不懂装懂时偷偷百度的我...

梦晨发自凹非寺量子位报道|公众号QbitAI聊天机器人一直是人工智障的代表。尽管从GPT-3开始,AI生成的文本已经能做到以假乱真,但这仅限于生成一段话。在连续聊天中,AI不会记得自己之前说过的话,就像下面这... 查看详情

原码反码补码详解!不懂的请看过来!(转)

本篇文章讲解了计算机的原码、反码和补码,并且进行了深入探求了为何要使用反码和补码,以及更进一步的论证了为何可以用反码、补码的加法去计算原码的减法。论证部分如有不对的地方请各位牛人帮忙指正!希望本文对大... 查看详情

80%的linux都不懂的内存问题(代码片段)

星标/置顶 公众号👇,硬核文章第一时间送达!前言之前在实习时,听了OOM的分享之后,就对Linux内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟࿰... 查看详情

80%的linux都不懂的内存问题(代码片段)

星标/置顶 公众号👇,硬核文章第一时间送达!前言之前在实习时,听了OOM的分享之后,就对Linux内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟࿰... 查看详情

80%的linux都不懂的内存问题(代码片段)

星标/置顶 公众号👇,硬核文章第一时间送达!前言之前在实习时,听了OOM的分享之后,就对Linux内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟࿰... 查看详情

遇到的比较好的文章

解决问题时遇到的比较好的文章,记录下来,经常更新,方便查阅:  01. Java快速扫盲指南  02.hashcode()和equals()及HashSet判断对象相等  查看详情

不懂的问题

...花了五天时间大致翻了一下这本书,说实话百分之七十都不懂,但是以下几个是我比较关注的问题。   第一:我们为什么要去构建之法现代软件工程?   第二:学习这门课对我们有什么帮助?   ... 查看详情

那些年搞不懂的"协变"和"逆变"

  博主之前也不是很清楚协变与逆变,今天在书上看到了有关于协变还是逆变的介绍感觉还是不太懂,后来看了一篇园子里面一位朋友的文章,顿时茅塞顿开。本文里面会有自己的一些见解也会引用博友的一些正文,希望通过本篇,... 查看详情

长久以来,你不懂的字符编码和字符集,这里都有

(从OneNote复制过来格式有点变了,大体不影响阅读,这篇文章花了好几天搜资料,终于写完了,暂时没精力将格式调好看一点~)常见的字符集或编码:ASCII占一个字节。最高位固定是0,共有2^7=1... 查看详情

搞不懂的github

...学渣来说,上这个英语网站真的是太“刺激”了,啥也看不懂,每点击一下之前,都得查查,真的是 查看详情

工具的意义

...满足于达成目标时需要的技术的理解,可以放过那些一时不懂的细节。工具应该怎么操作?  作为普通的程序员需要学会使用工具,增强理解能力,从而真正理解别人的想法,再基于自己的能力帮助他们实现这些想法。工具与... 查看详情

一个不懂的段错误

testdwordptr[eax],eax;probepage.我在main里定义了a[2000][2000]=0,发现溢出情况,查找后发现: 这跟局部数组变量定义所分配的最大空间设置大小有关。局部变量的申请空间是存放于栈中,windows里默认栈内存是1M,所以当申请空间大于1M... 查看详情

一段看不懂的代码(关于描述符)

1classCallbackProperty(object):2"""Apropertythatwillalertobserverswhenuponupdates"""34def__init__(self,default=None):5self.data=dict()6self.default=default7self.callbacks=dict()89def__get__(self,insta 查看详情

看不懂的算法系列

FFT套CDQ分治HDU5730dsuontree链统计/子树统计无修区间统计离线处理GSS2O(1)序列顺序维护问题//找不到那个课件了……后缀三连后缀数组/后缀自动机/后缀平衡树回文二连manacher/回文自动机字符串匹配四连hash/kmp/AC自动机/trie图... 查看详情

暂时不懂的知识点

只列出文件下的子目录命令:ls-F/opt/soft|grep/$ 列出/opt/soft文件下面的子目录输出:[[email protected]opt]#ls-F/opt/soft|grep/$jdk1.6.0_16/subversion-1.6.1/tomcat6.0.32/命令:ls-l/opt/soft|grep"^d"列出/opt/soft文件下面的子目录详细情况输 查看详情

近期的js笔记,就是为了可以多看看以前不懂的地方

1、//js实现保留两位小数functionreturnFloat(value){varvalue=Math.round(parseFloat(value)*100)/100;varxsb=value.toString().split(".");if(xsb.length==1){value=value.toString()+".00";returnvalue;}if(value.length&g 查看详情

立字以明志

...的文章,从今天开始再忙也要抽出时间好好总结,把自己遇到的问题记录下来,一 查看详情

快速看完整部教材,列出你不懂的5-10个问题,发布在你的个人博客上。

1)在第三章软件工程师成长的内容中,谈到了软件工程师与普通程序员的对比,如何才能成为一名合格的软件工程师?首先,需要学习良好的编程能力,作为一个合格的软件工程师至少要精通一门编程语言,编程能力直接决定... 查看详情