这样计算:Ctrl=0x40 ,所以Ctrl A =0x41-0x40=1.其他的Ctrl 类似.
'/n'在ASCII中是'LF'(Line Feed)即换行,而'/r'在ASCII中是'CR'(Carriage Return)即回车.
所以光有LF不会回到0列的.AT命令要求这样.
ctrl_Z 是Ctrl + Z(按下Ctrl键的时候同时按下Z键),输出^Z
就是空或者结束的意思,当然了也可以转化成条件的false
还有复杂一点的解释
首先,你的while形式是do while的,这样会造成无论如何,多读了一个字符,接下来p++,导致了最终的*p是没有存放任何字符的,真正的内容应该在*(p-2)的地方存放。
下面就牵涉到0x1a的问题了,某些C源文件编辑器会在每个C文件最后加入一个0x1a做标记(典型的就是tc2),而上面的代码就是检测这种情况,并且如果有0x1a作为标记的话,说明已经读到了文件的结尾,0x1a对我们的程序来说没有意义,所以把它改成'/0',但是如果是i<PROG_SIZE失败而导致的退出循环,则p-2这个位置的字符是有意义的,显然后来多读取的那个字符是没有用的,所以把p-1这个位置的字符置'/0',这样保证了返回的时候,返回的的确是一个字符串。
总结一下,0x1a是检测某些编辑器给文件强加的结束标志的(但是这个强制的标志并不是所有的编辑器都有,譬如VC++的编辑器就没有这个标志)。