| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 784 人关注过本帖
标题:编译时通过的,但是当我输入 massage 时就被强行停止了,是怎么回事呢?该如 ...
只看楼主 加入收藏
阿贞小朋友
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-3-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
编译时通过的,但是当我输入 massage 时就被强行停止了,是怎么回事呢?该如何修改?
/***************************************************************************
*功能:凯撒加密:把一条消息中的每个字母用字母表中固定距离之后               *
*         的那个字母来替代(如果越过字母Z,就绕回到字母表的起始位置。)    *
*作者:W                                                                    *
*时间:2014\04\ 27                                                          *
*                                                                          *
***************************************************************************/
#include <stdio.h>
#include <ctype.h>
#define SIZE 81
int main (void)
{
    int n,i,j ; // n 表示加密时字母移动的数,i,j 循环变量
    char ciphertext[SIZE];
    char ch ;
    printf("Enter a massage to be encrpted :");
    while((ch = getchar())!=EOF)  //遇到EOF时停止整个程序
    {
         while((ch = getchar())!='\n')  // 读取字符,存储于数组ciphertext[SIZE]中
            {
   
                ciphertext[i] = ch ;
                i ++ ;
            }
        printf("Enter shift amount :");
        scanf("%d", &n);
        if(n >= 1 && n <= 25)
        {
            for(j = 0 ; j < i ; j ++)
                {
                    ch = isalpha(ciphertext[j]) ;
                    if( ch != 0 )
                        {
                            ch = ((ch - 'A')+n)%26 +'A' ;
                            putchar(ch);
                        }
                    else
                            putchar(ch) ;
                }        
        }
          else
        {
                for(j = 0 ; j < i ; j ++)
                    {
                        ch = isalpha(ciphertext[j]) ;
                        if( ch != 0 )
                            {
                                ch = ((ch + 'A')+n)%26 -'A' ;
                                putchar(ch);
                            }
                        else
                                 putchar(ch) ;
                    }
        }

    printf("Enter a massage to be encrpted :");

    }

    return 0 ;
}


此题原来的题目:
有种古老的加密技术是凯撒加密,这种加密方法是把一条消息中的每个字母用字母表中固定距离之后的那个字母来替代(如果越过字母Z,就绕回到字母表的起始位置。)
编写程序,用凯撒加密方法对消息进行加密。用户输入待加密的消息和移位计数(字母移动的位置数目, 可取1,2,3….25)
当用户输入26与移位计数的差时,程序可以对消息进行解密。
提示:假定用户消息不超过80个字符。不是字母的字符不用更改。加密时不改变字母的大小写。为了解决绕回问题,可用表达式:
((ch – ‘A’) + n) % 26 + ‘A’ 计算大写字母的密码,其中ch存储字母,n存储移位计数(小写字母类似)
搜索更多相关主题的帖子: 2014 如何 字母表 加密 
2014-04-29 20:28
阿贞小朋友
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-3-16
收藏
得分:0 
还是看这份有注释清楚的吧


#include <stdio.h>
#include <ctype.h>
#define SIZE 81
int main (void)
{
    int n,i,j ; // n 表示加密时字母移动的数,i,j 循环变量
    char ciphertext[SIZE];
    char ch ;
    printf("Enter a massage to be encrpted :");
    while((ch = getchar())!=EOF)  //遇到EOF时停止整个程序
    {
         while((ch = getchar())!='\n')  // 读取字符,存储于数组ciphertext[SIZE]中
            {
   
                ciphertext[i] = ch ;
                i ++ ;
            }
        printf("Enter shift amount :");
        scanf("%d", &n);
        if(n >= 1 && n <= 25)   // 当n在1到25之间的时候加密
        {
            for(j = 0 ; j < i ; j ++)
                {
                    ch = isalpha(ciphertext[j]) ;
                    if( ch != 0 )            //  字母加密,然后输出   
                        {
                            ch = ((ch - 'A')+n)%26 +'A' ;  
                            putchar(ch);
                        }
                    else
                            putchar(ch) ;      //  非字母原样输出         
                }        
        }
          else                    //当n等于26时之间的时候解密
        {
                for(j = 0 ; j < i ; j ++)
                    {
                        ch = isalpha(ciphertext[j]) ;
                        if( ch != 0 )
                            {
                                ch = ((ch + 'A')+n)%26 -'A' ;
                                putchar(ch);                //  字母解密,然后输出
                            }
                        else
                                 putchar(ch) ; //  非字母原样输出
                    }
        }

    printf("Enter a massage to be encrpted :");  //继续输入massage

    }

    return 0 ;
}
2014-04-29 20:33
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:20 
可能是i没有初始化

总有那身价贱的人给作业贴回复完整的代码
2014-04-29 20:36
阿贞小朋友
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2014-3-16
收藏
得分:0 
嗯嗯!是的!
2014-04-30 15:48
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
收藏
得分:0 
while((ch = getchar())!=EOF)  //遇到EOF时停止整个程序
    {
          while((ch = getchar())!='\n')  // 读取字符,存储于数组ciphertext[SIZE]中
连续两个getchar不会有问题吗?
2014-05-03 20:57
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
收藏
得分:0 
while((ch = getchar())!=EOF)  //遇到EOF时停止整个程序
    {
          while((ch = getchar())!='\n')  // 读取字符,存储于数组ciphertext[SIZE]中
连续两个getchar不会有问题吗?
2014-05-03 20:57
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
message变成了马杀鸡。撸主究竟在想什么?这样怎么写程序呢?
如上所说:
i没有初始化。
两个 while 之间没有对第一个输入的非 EOF 字符作处理,直接忽视掉了。
2014-05-03 21:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你這程序沒處理小寫字母啦

授人以渔,不授人以鱼。
2014-05-04 17:52
快速回复:编译时通过的,但是当我输入 massage 时就被强行停止了,是怎么回事呢 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016575 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved