A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

       基础测试中10道题目,本人没有百度,没有查阅书籍,花了将近一天时间才搞定,阅卷老师给了十分,我想大概是看我的苦劳的份上吧,下面这道题是我花时间较多的,其实写代码用了20来分钟吧,中间有一句代码逻辑错误,调试用了2个小时左右,本人太菜,调试太少啊!现在贴出来与大家分享,要是违规的话,请版主删除!
题目如下
编程实现对键盘输入的英文名句子进行加密。用加密方法为:当内容为英文字母时,用26字母中的其后三个字母代替该字母,若为其它字符时不变。比如245a95n加密后是245bcd95opq。(C语言)

解析和代码如下:

#include <stdio.h>
#define MAXSIZE 500
char *secret( int len,char *ch );
int string_len( char *ch );
int main()
{
    char s[MAXSIZE]={0};
    char *p=s;
    unsigned int i=0;
    unsigned int length=0;
    printf("请输入加密之前的密码字符:\n");
   // s[i]=getchar();
    while( '\n'!=(s[i++]=getchar()) );              //循环控制输入
    length=string_len( s );                          //计算加密前字符串的长度
    p=secret( length,s );
    length=string_len( s );
    printf("加密之后的密码字符串为:\n");           //计算加密之后的字符串的长度
    for(i=0;i<=length;i++)                         //循环输出加密之后的代码
        printf("%c",*(p+i));
        printf("\n");
    return 0;
}
int string_len( char *ch )                        //计算字符串长度
{
        unsigned int len=0;
        while( ch[len] ) len++;                     //用len保存字符串的长度,循环加一
        return len;
}
char *secret( int len,char *ch )            //对输入的字符串进行加密
{
     int i=0;
     int j=len;
     while( ch[i] )
     {
         len=string_len( ch );
         if( ch[i]>='a' && ch[i]<='z' )
         {
             for(j=len;j>i;j--)
             {
                 ch[j+2]=ch[j];
             }
             ch[i]=(ch[i]-'a'+1)%26+'a';
             ch[i+1]=(ch[i]-'a'+1)%26+'a';
             ch[i+2]=(ch[i]-'a'+2)%26+'a';
             i+=3;
             continue;
         }
        if( ch[i]>='A' && ch[i]<='Z' )
         {
             for(j=len;j>i;j--)
             {
                 ch[j+2]=ch[j];
             }
            ch[i]=(ch[i]-'A'+1)%26+'A';
            ch[i+1]=(ch[i]-'A'+1)%26+'A';
            ch[i+2]=(ch[i]-'A'+2)%26+'A';
            i+=3;
            continue;
         }
         i++;
     }
     return ch;
}

评分

参与人数 1技术分 +1 收起 理由
Micro + 1 加油!!

查看全部评分

24 个回复

倒序浏览
技术贴 学习了  
回复 使用道具 举报
大家第一眼看估计都觉得简单,这道题目挺好的,等你仔细审题的时候就会发现没有你想象中的好搞,欢迎大家搞死代码,然后留言!
回复 使用道具 举报
楼主搞得复杂了,实际可以没有string_strlen和secret,直接读取字符判断字符是否需要加密然后输出对应的就可,楼主这样干实际上只能加密指定数目内的字符!(而且也可以最后添加'\0',使用strlen来计算字符串长度呀,或者不用字符串长度,直接到空字符退出)

点评

我不想用string方法,所以自己动手写了  发表于 2015-3-7 09:49
回复 使用道具 举报
撸主原谅我没看完你的代码 不过我觉得我这个更简单也能搞定这问题
#include <stdio.h>
#include <strings.h>
int main(int argc, const char * argv[]) {
    char string[20];
    printf("输入一个字符串:");
    gets(string);
    for (int i=0; i<=strlen(string)-1; i++) {
        if ((string[i]>='a'&&string[i]<='z')||(string[i]>='A'&&string[i]<='Z')) {
            string[i]+=3;
        }
    }
    printf("\n");
    puts(string);
    return 0;
}

点评

我怎么感觉一看就不行啊!  发表于 2015-3-7 09:51
m你没看清题意  发表于 2015-3-6 16:13
回复 使用道具 举报
keeganlee 发表于 2015-3-6 15:38
撸主原谅我没看完你的代码 不过我觉得我这个更简单也能搞定这问题
#include
#include

你这个没考虑后几位英文要移动成前几位字母
这个叫凯撒位移问题
楼主看看我的.我的总分只有9分,不知道扣在哪里
//
//  main.c
//  测试题8
//
//  Created by 张泽阳 on 3/5/15.
//  Copyright (c) 2015 张泽阳. All rights reserved.
//
/**
*  8、 编程实现对键盘输入的英文名句子进行加密。
*  用加密方法为:当内容为英文字母时,用26字母中的其后三个字母代替该字母,若为其它字符时不变。
*  比如245a95n加密后是245bcd95opq。(C语言)
*/
#include <stdio.h>
#define MAX_WORD_LENGTH 101//最长单词长度限制
/**
*  本题学名叫“凯撒位移加密”,本函数将给定的字符数组进行制定方法的位移。
*  正常时返回0,异常时返回1。
*/
int encryptWord(char* word){
    for (int i = 0 ; word ; ++i) {
        if (i == MAX_WORD_LENGTH) {//如果单词太长则异常退出
            return 1;
        }
        //如果是英文单词
        if  (  (('a' <= word)&&(word<='z'))  ||  (('A'<=word)&&(word<='Z'))   ){
            if (//特殊情况处理
                ( (('z'-3) < word)&&(word <= 'z')   )
                ||( (('Z'-3) < word)&&(word <= 'Z')   )
                )
            {
                word -= ('Z' - 'A' +1);
            }
            word += 3;
        }
    }
    return 0;
}
char word[MAX_WORD_LENGTH]  = {0};
int main(int argc, const char * argv[]) {
    printf("请输入待加密的字符串:\n");
    scanf("%s",word);
    if (encryptWord(word)){
        printf("长度超标!程序退出!\n");
        return 1;
    }
    printf("%s\n",word);
    return 0;
}
回复 使用道具 举报
zzyyzz1992 发表于 2015-3-6 16:16
你这个没考虑后几位英文要移动成前几位字母
这个叫凯撒位移问题
楼主看看我的.我的总分只有9分,不知道扣 ...

用scanf读取字符串是不行的,遇到空白符就不读了!!
回复 使用道具 举报
passchaos 发表于 2015-3-6 16:20
用scanf读取字符串是不行的,遇到空白符就不读了!!

噢,知道了,gets
回复 使用道具 举报
这不是凯撒移位,凯撒移位是一对一的。楼上的都限制了字符串的大小,显然不符合题意。我写了一个如下:
#include <stdio.h>


int main(void)
{
    int ch;

    while ((ch=getchar()) != '\n') {
        /* 注意使用%是为了处理'x','y','z'(或大写),'x'对应yza */
        if (ch >= 'a' && ch <= 'z')
            printf("%c%c%c", (ch-'a'+1)%26+'a', (ch-'a'+2)%26+'a',
                   (ch-'a'+3)%26+'a');
        else if (ch >= 'A' && ch <= 'Z')
            printf("%c%c%c", (ch-'A'+1)%26+'A', (ch-'A'+2)%26+'A',
                   (ch-'A'+3)%26+'A');
        else
            printf("%c", ch);
    }
    printf("\n");

    return 0;
}




点评

你这个代码,我想过,不存储直接输出了,感觉不太好,所以我没去这样写,每个人都有自己的风格吧!  发表于 2015-3-7 10:02
回复 使用道具 举报
passchaos 发表于 2015-3-6 16:36
这不是凯撒移位,凯撒移位是一对一的。楼上的都限制了字符串的大小,显然不符合题意。我写了一个如下:
#in ...

这个写的不错 可以结贴了:lol
回复 使用道具 举报
zzyyzz1992 发表于 2015-3-6 16:16
你这个没考虑后几位英文要移动成前几位字母
这个叫凯撒位移问题
楼主看看我的.我的总分只有9分,不知道扣 ...

没有苹果机,也懒得去调试,不过感谢分享了!
回复 使用道具 举报
=,=我也有这题,也想出来了。。。  
你们都分享完了,我就学习了!
回复 使用道具 举报
passchaos 发表于 2015-3-6 16:36
这不是凯撒移位,凯撒移位是一对一的。楼上的都限制了字符串的大小,显然不符合题意。我写了一个如下:
#in ...

http://baike.baidu.com/link?url=8CylKuA695oWM2DlkS5lJA8QKUK6WfIVjtm7bWxgJzQS4MOODebhhNmefMXq0N5FZpjYxWFWet07wf88edWsMK
这个是凯撒密码的定义。显然本题属于凯撒移位密码。
回复 使用道具 举报
好顶赞`
回复 使用道具 举报
keeganlee 发表于 2015-3-6 16:56
这个写的不错 可以结贴了

大哥可以不用这么贱的头像不
回复 使用道具 举报
楼主这个题思路完全正确,就是有很多啰嗦代码!
回复 使用道具 举报
xiezhongmin 发表于 2015-3-7 16:35
楼主这个题思路完全正确,就是有很多啰嗦代码!

没去优化,话说技术分怎么混?
回复 使用道具 举报
最简单的那个,可读性不太好。
回复 使用道具 举报
加油吧,,孩子,,,黑马等着你啊,
回复 使用道具 举报
JuniorACMer 发表于 2015-3-8 08:48
没去优化,话说技术分怎么混?

我是准备去5期的,现在都到7期了,技术分肯定多
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马