荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店