荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: kaman (天外飞仙), 信区: Program
标 题: [合集]请教一题,电文加密
发信站: 荔园晨风BBS站 (Sat Apr 17 19:47:38 2004), 站内信件
bakey (飘云) 于Sun Apr 4 10:37:14 2004提到:
电文加密:将用户输入的电文变成其后的第8个字母。例如:a变成i,a变成i等等
这是我写的代码,但不知为什么不对的,请高手指教啊
#include <stdio.h>
void main()
{
int i;
char text[100];
printf("请输入你要加密的电文:");
scanf("%s",&text);
for (i=0;i<100;i++)
{
if (text[i]=32)
text[i]=32;
if ((text[i]>114)||(text[i]>82))
text[i]-=18;
else
text[i]+=8;
}
printf("加密后的电文是:%s\n",text);
}--
看什么看???没见过不会做签名档的人啊
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.111.149]
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.111.149]
kevinh (单飞) 于Sun Apr 4 10:55:04 2004提到:
~~~~~~~~ 这样是错的。。。改为text吧。
~~~ 不知道什么意思,这样条件永远成立。
这句和 if(text[i]>82)是完全一样的。。。
中间for部分可重写为:
for(i=0;i<100;i++)
if(text[i]>=65&&text[i]<=82||text[i]>=97&&text[i]<=114)
text[i]+=8;
else if(text[i]>=83&&text[i]<=90||text[i]>=115&&text[i]<=122)
text[i]-=18;
不知道怎么写得简单点。。。。
Kenniel (笑翻下先^_^) 于Sun Apr 4 11:35:01 2004提到:
他的意思就是空格的时候不用转变
但是应该是 text[i] == 32呵呵
bakey (飘云) 于Sun Apr 4 11:38:02 2004提到:
哈哈,不好意思啊,我是初学的,经常犯些低级错误啊,见笑了。不过
kevinh (单飞) 于Sun Apr 4 11:43:49 2004提到:
因为text本身就代表了一个地址。
bakey (飘云) 于Sun Apr 4 12:02:53 2004提到:
#include <stdio.h>
void main()
{
int i;
char text[100];
printf("请输入你要加密的电文:");
scanf("%s",text);
for(i=0;i<100;i++)
{
if (text[i]==32)
text[i]=32;
if (((text[i]>=65)&&(text[i]<=82))||((text[i]>=97)&&(text[i]
<=114)))
text[i]+=8;
else if
(((text[i]>=83)&&(text[i]<=90))||((text[i]>=115)&&(text[i]<=122)))
text[i]-=18;
}
printf("加密后的电文是:%s\n",text);
我把代码改成了这样,但是只能输入一段字符,只要中间有空格,空格后的
字符就输不出来了。
?
kevinh (单飞) 于Sun Apr 4 12:13:17 2004提到:
实在不清楚这样有什么用。如果是空格,就让它等于空格。
scanf() 把空格当作结束符号,所以只能读取一段。也就是说,text中只包含
空格前一段。
bakey (飘云) 于Sun Apr 4 12:19:38 2004提到:
哦,这样的啊,我一直以为空格它也是当作一个字符来读取的呢!!!
那么什么解决的办法吗?加密的电文里不可能中间没有空格的啊?
kevinh (单飞) 于Sun Apr 4 12:22:55 2004提到:
不如把电文保存为文件,打开文件进行加密得了。这样更方便!
bakey (飘云) 于Sun Apr 4 12:25:24 2004提到:
kevinh (单飞) 于Sun Apr 4 12:29:58 2004提到:
c语言也可以打开文件啊。
FILE *fp;
fp=fopen("abc.txt","r+");
.......
.....
..
.
bakey (飘云) 于Sun Apr 4 12:33:13 2004提到:
晕,你看我的代码就知道是菜鸟啦,哪里学到这么复杂的了,现在
kevinh (单飞) 于Sun Apr 4 12:41:26 2004提到:
那样的话,就用getchar() 和 while 循环吧。
可以把句末的句号当结束符,当输入的字符非句号时,逐个赋值给数组元素。
bakey (飘云) 于Sun Apr 4 13:22:16 2004提到:
怎么这么多问题的啊,代码写成这样都差不多了,也有正确的结果了。但是
输出后有出现几十个汉字那样的字符,怎么回事?我是用VC来编译的
#include <stdio.h>
void main()
{
int i,j;
char text[100];
printf ("Please input original text:");
for(i=0;i<100;i++)
{
text[i]=getchar();
if (text[i]=='\n')
break;
if (((text[i]>=65)&&(text[i]<=82))||((text[i]>=97)&&(text[i]
<=114)))
text[i]+=8;
else if
(((text[i]>=83)&&(text[i]<=90))||((text[i]>=115)&&(text[i]<=122)))
text[i]-=18;
}
for (j=0;j<100;j++)
putchar(text[j]);
putchar('\n');
}
kevinh (单飞) 于Sun Apr 4 13:31:14 2004提到:
忘了提醒你,最后再加上0作为结束符。
printf("%s",text);
没必要用循环。
yanhong (feeling) 于Sun Apr 4 13:39:14 2004提到:
#include <string.h>
#include <ctype.h>
int n;
n=strlen(text);/*求窜的长度*/
puts(text);
yanhong (feeling) 于Sun Apr 4 13:42:31 2004提到:
用printf遇到空格就停止,可以用puts(text); ^_^
kevinh (单飞) 于Sun Apr 4 13:46:45 2004提到:
哈哈,做多了那些不用已有函数而要求自己编写的题后,都不记得去用了。。。。。。
kevinh (单飞) 于Sun Apr 4 13:49:48 2004提到:
Thx,忘了和scanf一样的。。。。。。。。。
yanhong (feeling) 于Sun Apr 4 13:55:22 2004提到:
text[i+1]='\0';
puts(text);
/*
bakey (飘云) 于Sun Apr 4 15:28:18 2004提到:
呵呵,这次终于行了,真谢谢两位的大力帮忙了。
jsx (大庆) 于Wed Apr 7 21:57:42 2004提到:
这个程序也也可以达到要求,不妨也参考一下。
#include<iostream>
using namespace std;
int main()
{
int i,j;
char a[100],p;
for(i=0; i<100; i++)
{
cin.get(a[i]);
j=i;
if(a[i]=='\n') break;
}
for(i=0; i<j; i++)
{
if(a[i]==32) {cout<<" "; continue;}
p=a[i]+8;
if(a[i]>82&&a[i]<=90 ||a[i]>114&&a[i]<=122)
p=a[i]-18;
cout<<p;
}
cout<<endl;
return 0;
}
bakey (飘云) 于Wed Apr 7 22:58:49 2004提到:
jsx (大庆) 于Wed Apr 7 23:02:41 2004提到:
其实是一样的,就是把printf 改成cout 把 scanf改成cin
huhaiming (一生只爱她) 于Thu Apr 8 09:27:11 2004提到:
我也凑凑热闹,写写程序
#include <stdio.h>
#include <ctype.h>
int main()
{
char buff[255];
for(int i=0;scanf("%s",buff)!=EOF;i=0)
{
for(;buff[i]!='\0';i++)
buff[i]+=(buff[i]>114 || (buff[i]>82 && isupper(buff[i])))?-18:8;
puts(buff);
}
return 0;
}
jjksam (ramdisk_size=32768) 于Thu Apr 8 19:11:09 2004提到:
最短可以这样写.不用自己写一个函数.
/* 加密 */
/* ./encode < file.txt > encodefile.txt */
main(c){while((c=getchar())+1)
putchar(isalpha(c)?(tolower(c)<'s'?(c+8):(c-18)): c);}
/* 解密 */
/* ./encode < file.txt > encodefile.txt */
main(c){while((c=getchar())+1)
putchar(isalpha(c)?(tolower(c)<'h'?(c-8):(c+18)): c);}
/* 可以美化一下代码给你看看 :) 加上一个函数 */
/* abcdefghijklmnopqrstuvwxyz */
/* ijklmnopqrstuvwxyzabcdefgh */
/* 加密程序 */
/* filename: encode.c */
/* command line: ./encode < file.txt > encodefile.txt */
char encode(c)
{
return (tolower(c)<'s'?(c+8):(c-18));
}
main(c)
{
while ( (c=getchar())+1 )
putchar( isalpha(c) ? encode(c) : c);
}
/************************************************************/
/* 解密程序 */
/* filename decode.c */
/* command line: ./decode < encodefile.txt > decodefile.txt */
char decode(c)
{
return (c>'h'?(c-8):(c+18));
}
main(c)
{
while ( (c=getchar())+1 )
putchar( isalpha(c) ? decode(tolower(c)) : c);
}
jjksam (ramdisk_size=32768) 于Thu Apr 8 19:26:27 2004提到:
你这个很多问题.
如果输入太多的话你的这个程序就不能运行.
还有你的没判断是否是字符,他只是说要转字符,没说转标点和数字.
如果我文件中一行超过255个字符,你的程序没法运行.
测试数据:
123456578979//*j((@#)()!(@#)(@!(@#()!@(Ijj1341.2...lkjj
加密后会变成这样
9:;<=>=?@A?A772r00H+101)0H+10H)0H+01)H0Qrr9;<96:666tsrr
jjksam (ramdisk_size=32768) 于Thu Apr 8 19:28:57 2004提到:
这个程序更不行:
测试数据如下:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM
NOPQRSTUVWXYZabc
defghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk
efghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
123456578979//*j((@#)()!(@#)(@!(@#()!@(Ijj1341.2...lkjj,
# test2 < testfile.txt
结果如下:
IJKLMNOPQRSTUVWXYZABCDEFGHijklmnopqrstuvwxyzabcdefghIJKLMNOPQRSTU
~~;
huhaiming (一生只爱她) 于Thu Apr 8 19:57:14 2004提到:
这样的程序就不需要用STL了吧~~~~~~~~
255是定义的,可以加很长咯,反正是一行一行地处理,再不行就用gets()咯
但是程序就有点不短了
加判断就加一个isalpha()就行
jjksam (ramdisk_size=32768) 于Thu Apr 8 20:00:54 2004提到:
问题是这样的思想就错了..像这种要求的程序不应该定义固定长度的数组.
2^10行就不行了. take a look at my program. 可以处理任何长度输入.
jsx (大庆) 于Thu Apr 8 20:38:39 2004提到:
是啊 那个数字是定义的,可以改的很大,那样就没有必要担心不够处理了
而且我们作业上要求加密的只是英文字母,不包括数字和符号。
jsx (大庆) 于Thu Apr 8 20:41:04 2004提到:
还有可能我的层次还太低,你的代码中,我有很多看不懂。
jjksam (ramdisk_size=32768) 于Thu Apr 8 20:52:39 2004提到:
只是把相应的代码转换而已,最简单的了。
getchar
putchar
还有 ?: 判断。
if都没有用到呢
另外有c语言的命令行参数的知识,你要看一下。
还有ASCII的相关知识你要看一下,然后这个代码就是超级简单了。
那些 + -运算就是利用c语言中char型可以和int型混用的功能.
这个程序已经是最基本的c语言程序..不要说看不懂.
bakey (飘云) 于Thu Apr 8 20:55:54 2004提到:
jjksam (ramdisk_size=32768) 于Thu Apr 8 20:57:46 2004提到:
可以参考一下unix中一些基本命令的实现,很多都是用这样的思想。
基本上i/o是用管道或者重定向,这些工具组合起来可以变成很强大的工具。
例如编译器, 也是利用这样的思想。
jjksam (ramdisk_size=32768) 于Thu Apr 8 20:58:36 2004提到:
不知道这些还学c语言?好好看书吧,多实践。
kaman (天外飞仙) 于Fri Apr 9 19:45:44 2004提到:
斗短~~~
#include<stdio.h>
main()
{
char c;
while((c=getchar())+1)
putchar((c<133 && c>96)?(97+(c-89)%26): c);
}
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店