加密算法(输入流无‘\n‘作为结尾)

描述

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。

例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。

输入

China

输出

Glmre

输入样例 1 

China

输出样例 1

Glmre

输入样例 2 

Singapore

输出样例 2

Wmrketsvi

提示

输入流无'\n'作为结尾,因此这题不可以用 \n 作为输入结束的检测标志位,可以用EOF作为输入结束的检测标志位。

让我自己想的话,我会敲出这样的代码(如下),毕竟输入样例后答案都符合,但很显然,我忽略了处于边缘字母的输出(例如输入“z”会输出“~”)

#include <iostream>
using namespace std;
int main()
{
	char a;
	int i;
	while ((a = getchar()) != EOF)
	{
		putchar(a + 4);
	}
	return 0;
}

正确代码应该是:

#include <iostream>
using namespace std;
int main()
{
	char a;
	while ((a = getchar()) != EOF)
	{
		if ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'))
		{
			a=a+4;
			if ((a > 'Z' && a <= 'Z' + 4) || (a > 'z'))
				a = a - 26;
		}
		putchar(a);
	}
	return 0;
}

问题点:

①:getchar()的作用是从终端输入一个字符,getchar函数没有参数。

②:putchar()的作用是向终端输出一个字符。

③:‘\0’ 与 ‘\n’ 与 EOF 的区别

‘\0’ 
1.字符串结束符,字符串的结尾标志,存储在字符串的结尾。 
2.在ASCII字符集中对应空字符NULL,数值为0。 
3.在使用过程中要为其分配内存空间,但不计入字符串长度。 
4.用scanf(“%s”,s);和gets(s)输入字符串后系统会自动在字符串的末尾加上一个’\0’。(所以用puts函数输出字符串时会在字符串后停止)

比如:char cha[5]表示可以放4个字符的字符串,由于c/c++中规定字符串的结尾标志为’\0’,它虽然不计入串长,但要占内存空间,而一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放4个字母的字符串(数组的长度必须比字符串的元素个数多1,用以存放字符串结束标志’\0’)或者放2个汉字(1个汉字占2个字节,1个字母占一个字节),cha[5]占5个字节的内存空间。

‘\n’(new line) 
1.换行(LF) ,将当前位置移到下一行开头。 
2.ASCII码值(十进制)是10.

EOF(End Of File) 
1.表示文件结束符(end of file)。 
2.在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。 
3.EOF 的值通常为 -1,在文本文件中,数据都是以字符的ASCII代码值的形式存放。ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。 
4.C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。 
5.C语言中,EOF即文档的结尾.但是,当你写一个小程序,并以EOF作为判断条件时,就无法输入文档的结尾了,只能人工输入一个,这个人工输入的文档结尾就是Ctrl+Z.(Ctrl+Z的值是-1,可以尝试将EOF替换成-1) 
6.示例: 
while(scanf(“%d”,&n)!=EOF);//注意:scanf函数有返回值,详见《scanf函数》。 
while(getchar()!=EOF);//getchar函数也有返回值,格式错误返回-1.

此处有关(‘\0’ 与 ‘\n’ 与 EOF 的区别)来自博文https://blog.csdn.net/u011572481/article/details/78507411

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值