密码翻译

来源:互联网 发布:10月外贸数据 编辑:程序博客网 时间:2024/06/06 02:35
描述

在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。

输入
输入一行,包含一个字符串,长度小于80个字符。
输出
输出每行字符串的加密字符串。
样例输入
Hello! How are you!
样例输出
Ifmmp! Ipx bsf zpv!
来源

计算概论05


  • 查看 
  • 提交 
  • 统计 
  • 提问
    #include<iostream>#include<cstring>#define MAXN 80using namespace std;char a[MAXN+10];int main(){fgets(a,MAXN+10,stdin);int len,i;len=strlen(a);for(i=0;i<len;i++){if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'){if(a[i]!='z'&&a[i]!='Z'){a[i]=a[i]+1;continue;//!=即跳过这层循环,进入下一次 }if(a[i]=='z') a[i]='a';if (a[i]=='Z') a[i]='A';}}puts(a);return 0;} 

    • #include<iostream>#include<cstring>#define MAXN 80using namespace std;char a[MAXN+10];char b[MAXN+10];int main(){gets(a);int len,i;len=strlen(a);for(i=0;i<len;i++){if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z'){if(a[i]!='z'&&a[i]!='Z'){b[i]=a[i]+1;}if(a[i]=='z') b[i]='a';if (a[i]=='Z') b[i]='A';}else b[i]=a[i];}for(i=0;i<len;i++) cout<<b[i];return 0;} 

      gets()函数

          原型:char * gets(char * buffer);

          参数:将读取的结果存放在buffer指针所指向的字符数组中

          头文件:stdio.h

          返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。


          从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。gets()能够接受空格、制表符TAB,并不会因为字符串中有空格或者TAB而结束字符的获取,但和scanf()一样,读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。


          本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets()来替换gets()

      参考http://blog.csdn.net/xsunrise/article/details/45008887

      fgets()函数


          原型:char *  fgets(char * s, int n, FILE *stream);

          头文件:stdio.h

          参数:
               s: 字符型指针,指向存储读入数据的缓冲区的地址。
               n: 从流中读入n-1个字符,第n个写入'\0'表示字符串结束。
               stream : 指向读取的流。
         返回值:
                1. 当n<=0 时返回NULL,即空指针。
                2. 当n=1 时,返回空串""。
                3. 如果读入成功,则返回缓冲区的地址。
                4. 如果读入错误或遇到文件结尾(EOF),则返回NULL。



           在用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。


              example:
                    char s[100]; //可以。
                    char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

          所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];如果未分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。


          fgets(...)读入文本行时的两种情况。

          如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回,换行符也保存,并且在s的最后插入字符串结束标志'\0', 而s缓冲区剩余的位置不会再填充。

          如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'。fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要文本流没关闭。



          fgets(...)读入整个文件内容,通常用while()循环来使fges()读入文本全部内容,并按行读入。


          char s[1024];

          while((fgets(s,1024,fp))!=NULL)

          {

              printf(s);

          }

           当然如果n小于每行的字符个数,也可以读,只不过读的次数要多。

          假设一行为 : 123456789

          char s[2];

          int  num=0;

          while((fgets(s,2,fp))!=NULL)//注意每次读一个字符,则第二个参数应为2

          {

              printf(s);

              n++;

          }

          每次读入一个字符, 最后也会读完一行,num=10,读了十次。所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭。


          读入空行的情况

          第一行   abcdef123

          第二行

          第三行  helloworld

          其中第二行为空,fget(..)会把第二行也读入,因为并未到文件结尾。

          有时我们并不需要空行,可以这样做。

          while((fgets(s,n,fp))!=NULL)

          {

              if(strlen(s)!=1)    //注意这儿是1不是0,因为尽管是空行,它也会读入换行符,strlen(s)=1;

              printf(s);

          }


          用fgets(...)还也读入标准输入设备(一般为键盘)的信息
          原型:fgets(s,n,stdin);


          假设在控制台下,我们可以用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,因为不会像gets()有溢出的可能,但是是从stdin流输入缓冲读入。


      在C++中读取一行的函数getline和cin.getline是不读入换行符的,而GCC中getline函数是读入换行符的。可以理解为,一般情况下不读入,特别的是GCC的读入。
          fgets、gets用于字符数组,geline(cin,a)是读入字符串,都可以读入空格,换行符结束。
            #include<iostream>#include<cstring>#define MAXN 80using namespace std;char a[MAXN+10];int main(){fgets(a,MAXN+10,stdin);int len,i;len=strlen(a);for(i=0;i<len;i++){if(a[i]>='a'&&a[i]<'z'||a[i]>='A'&&a[i]<'Z'){a[i]=a[i]+1; }else if(a[i]=='z') a[i]='a';//一定要加else ,否则初始的y输出为a而不是zelse if(a[i]=='Z') a[i]='A';}puts(a);return 0;}