分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
多数程序员都会在不经意间遇到下面这两个问题:
1. linux上用vim写的文件test.txt拷贝到windows上, 结果所有的内容都显示在一行中。(当然, 如果你Windows上的编辑显示器够智能, 那就是另外一回事了)
2. Windows上建立的test.txt拷贝到linux上, 结果linux程序运行异常。(当然, 如果你的linux程序足够健壮, 那就没有问题了)
ps. 当你在Windows上写好linux shell script, 拷贝到linux下运行, 就会出问题。
为什么会出现上面的问题呢? 这就需要我们了解\r\n和\n了。
我们先以Windows为例来说明。 我们来新建一个dos.txt文件, 然后在第一行敲一下enter键, 然后保存文件。 此时, 我们查一下这个文件的大小, 结果发现是2个字节(而不是1个), 用UltraEdit查阅一下, 就知道文件中的两个字节是0x0d和0x0a, 也就是\r和\n. 但是, 如果用C程序来读取dos.txt文件, 发现又根本没有读取到\r, 这是怎么回事呢? 原来: 在Windows上的dos.txt文件中, 按一下enter键, 实际上就相当于C程序写\n字符,而由于历史原因, 写文件的时候, Windows系统会自动在\n前面加上\r, 这样, dos.txt文件中就有了\r\n了, 在读取的时候, Windows系统会自动去掉\r, 所以你的C程序根本读不读\r, 还是\n.
实话实说, 我发现很多地方讲\r\n和\n, 都说得不太清楚, 下面我来说一下, 希望是更清楚, 而不是更模糊:
Windows系统中有如下等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\r\n(0x0d0x0a) <====>程序真正读取的是\n
linux系统中的等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\n(0x0a) <====> 程序真正读取的是\n
现在, 我们看看本文开头部分的问题。 假设有一个linux下的unix.txt文件, 那么, 它在文件中的换行标志是:\n, 现在把unix.txt拷贝靠Windows上, 那好啊, Windows那双犀利的眼神仿佛是在对unix.txt文件说: 别跟我整什么\n, 我只认识文件中的\r\n, 如果你这个unix.txt文件里面有\r\n, 那我就认为是换行符, 否则, 我不认你。 如此一来, Windows压根就找不到unix.txt中的\r\n, 所以, 对于Windows而言, 压根就没有发现unix.txt有任何换行, 所以, 我们从Windows上看到的unix.txt文件显示在一行里面。
同理, 假设Windows上有一个dos.txt文件, 那么, 它在文件中的换行标志是\r\n, 现在拷贝到linux下, 那好啊, 正如linus一样, linux这个倔强的家伙貌似在说: 别的我不管, 我遇到文件中的\n, 我就认为是换行, 至于其他的, 我只认为是正常的字符。 如此一来, \r就被当成了文件的正常部分, 也就是说, linux下的C程序不仅仅会读取到\n, 也会读取到它前面的\r.
实际上Windows上的文件是dos格式的, 而linux上的文件是unix格式的, 我们可以通过linux上的dos2unix和unix2dos来实现转化, 当然, 有的linux环境下, 需要用busybox dos2unix和busybox unix2dos.
下面, 我们用程序来简要验证一下上面的部分叙述。 现在Windows上创建一个dos.txt文件, 第一行写入12, 然后按enter, 然后在第二行写入3, 不按enter, 然后保存。 我们先来看看Windows上的程序:
// VC++6.0#include <stdio.h>#include <string.h>int main(){ char szTest[100] = {0}; int len = 0; FILE *fp = fopen("dos.txt", "r"); if(NULL == fp) { printf("failed to open dos.txt\n"); return 1; } fgets(szTest, sizeof(szTest) - 1, fp); len = strlen(szTest); if('\n' == szTest[len - 1]) { printf("yes1\n"); } if('\r' == szTest[len - 2]) { printf("yes2\n"); } memset(szTest, 0, sizeof(szTest)); fgets(szTest, sizeof(szTest) - 1, fp); len = strlen(szTest); if('\n' == szTest[len - 1]) { printf("yes3\n"); } if('\r' == szTest[len - 2]) { printf("yes4\n"); } fclose(fp); return 0;}
程序结果为:
yes1
我们看到, 读取的时候\r确实被去掉了。
好, 我们把dos.txt拷贝到linux下, 然后运行下面相同的程序:
// gcc#include <stdio.h>#include <string.h>int main(){ char szTest[100] = {0}; int len = 0; FILE *fp = fopen("dos.txt", "r"); if(NULL == fp) { printf("failed to open dos.txt\n"); return 1; } fgets(szTest, sizeof(szTest) - 1, fp); len = strlen(szTest); if('\n' == szTest[len - 1]) { printf("yes1\n"); } if('\r' == szTest[len - 2]) { printf("yes2\n"); } memset(szTest, 0, sizeof(szTest)); fgets(szTest, sizeof(szTest) - 1, fp); len = strlen(szTest); if('\n' == szTest[len - 1]) { printf("yes3\n"); } if('\r' == szTest[len - 2]) { printf("yes4\n"); } fclose(fp); return 0;}
结果:
0000000: 3132 0d0a 33 12..3
[taoge@localhost learn_c]$ gcc test.c
[taoge@localhost learn_c]$ ./a.out
yes1
yes2
[taoge@localhost learn_c]$
我们看到, 读取的时候, \r还在。
OK, 至此, \r\n和\n的问题基本算是清楚了, 以后再也不用纠结了。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
创建一个自定义列表
- Markdown
- Text-to- HTML conversion tool
- Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 是通过欧拉积分
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 现有任务
已完成 :done, des1, 2014-01-06,2014-01-08
进行中 :active, des2, 2014-01-09, 3d
计划一 : des3, after des2, 5d
计划二 : des4, after des3, 5d
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎