C语言字符型数据(一)—简单的恺撒密码

首先声明:这些内容主要是面向C语言的初学者,尤为是正在学习C语言的学生。编程

       学习C语言的字符型数据时,首先须要记住两条重要特性:1.字符型数据存储的是字符的ASCII码值;2. 因为ASCII码值本质上是一个整数,所以字符型数据能够像整数同样作加减运算。光记住这两条只能应付一些简单的考试题,要想利用字符型数据来解决一些实际的应用问题,还须要更多的练习。本文中的例子将结合文本文件的操做来加强对字符型数据的学习。函数

       文本文件中每一个英语字符占一个字节,存储的也是字符的ASCII码值,所以对文本文件的操做,彻底能够借助字符型数据来处理。从文本文件中读出的一个字符,能够存储在字符型变量里,而后按照应用需求对字符型变量进行处理,最后把该变量写回文本文件中去。学习

例1:用记事本编辑一个名为“original.txt”的文本文件,其中包含一段英语文本。如今要求编程序对该文件内容按照恺撒密码进行加密,加密后的内容保存到一个新文件 “result.txt” 中。 测试

       恺撒密码是一种古老的加密方法,是指把信息中的每个字母用字母表中的该字母后的第三个字母代替,即a被d替换,b被e替换,…,z被c替换。假设从文件中读出的字符存放在字符型变量ch中,这种替换能够很容易的描述为:ch = ch + 3; 当ch + 3大于‘z’时,须要转回去从a再开始,所以须要减去26。为了简单起见,咱们对非字母字符不作任何处理,原样输出。加密

       初学者可能对文件的打开和读写不太熟悉,咱们在这里用freopen函数来简化对文件的操做,freopen函数能够将标准输入stdin(对应的是键盘)和标准输出stdout(对应的是显示器)分别重定向到输入文件和输出文件,也就说,原本从键盘输入数据,如今改成从输入文件读取数据,原本是向显示器输出数据,如今改成向输出文件输出数据。这样的好处是,能够直接使用scanf,getchar,printf和putchar函数读写文件数据。这也是程序设计竞赛中经常使用的读取测试数据的方法。设计

程序:code

#include "stdio.h"
int main()
{
    char ch;
    freopen("original.txt","r",stdin) ; //输入输出被分别重定向到两个文件。
    freopen("result.txt","w",stdout);
    ch=getchar();
    while(ch!=EOF)    //EOF指文件的末尾
    {
        if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
        {
            ch=ch+3;
            if(ch>'z'||(ch>'Z'&&ch<='Z'+3))
                ch= ch-26;
        }               
        printf("%c",ch);
        ch = getchar();
    }
    return 0;
}

  图1显示的是original.txt文件中的内容,图2显示的是加密处理后的内容。blog

                                                                                       图1. original.txt文件get

                                                                                       图2. result.txt文件io

       可能不少初学C语言的同窗在学习字符型数据时,尚未学习条件语句、循环语句以及文件的读写,由于大多数教材的编排顺序每每先是数据类型,而后才是控制语句,文件一般是放在最后一章的。若是彻底按照教材循序渐进,学的知识点会比较零散,难以造成一个总体。所以,我建议老师在教前面的知识时,在例子程序中能够适当地将后面的内容加进来一些,对于没学到的知识点,老师稍做讲解,学生大致是能够明白的,有兴趣的同窗也能够提早自学后面的内容。这样有利于学生将多个知识点在脑海中串成一个总体。

       回到上面的文本文件操做问题,有些学生可能会有疑问,若是文件的内容不是英文,而是汉字呢,能用相同的方法读取并处理汉字吗?下一篇文章中咱们将把字符型数据的学习扩充到对汉字的简单处理。