Nisy 发表于 2009-5-25 10:05:37

第七课字符加密中的一个问题

群里有人这样一个问题: 输入字符串后 我们如何开辟一个大小合理的空间 以 处理输入的字符串

有几个函数 大家可以看一下
malloc 开辟空间 这个视频里我们讲过
strlen 计算字符串的长度
假如我们输入的是: ChinaPYG!strlen是求该字符串的长度 结果=9 其实该字符串还有一个结束标志 就是'\0' 我们开空间的时候 可以多开一个字节的空间把这个也COPY过去

放一个示例代码,仅处理下大写字母:

#include "stdio.h"
void JiaMi(char *p,int i)
{
    while(*p)
    {
      if(*p >= 'A' && *p<= 'Z')
      {
            *p++=(*p-'A'+i)%24+'A';
      }
    }
}
main()
{
    char str;
    char * p;
    int i;
    gets(str); /*scanf("%s",str);*/
    puts(str);
    printf("Shuru zifu: %d\n",strlen(str));
    p = (char *)malloc(strlen(str)+1);
    memcpy(p,str,strlen(str)+1);
    puts(p);
    printf("Shuru Jiami: ");
    scanf("%d",&i);
    JiaMi(p,i);
    printf("Jiami XiaoGuo: ");
    puts(p);
}


想要处理含有非大写字符的字符串, 自己加一行代码即可 ~

C:\tc>test
ChinaPYG!
ChinaPYG!
Shuru zifu: 9
ChinaPYG!
Shuru Jiami: 10
Jiami XiaoGuo: MhinaBKQ!


这个Demo 仅供参考 完整的代码 大家自己去补充下吧

hackerdiy 发表于 2009-5-25 10:08:42

不是啊
我的怎么可以动行小写的字啊

hackerdiy 发表于 2009-5-25 10:11:15

呵呵
打错字到哈
是个运行哈

hackerdiy 发表于 2009-5-25 10:12:27

沙发也坐了
呵呵/:017

[ 本帖最后由 hackerdiy 于 2009-5-25 10:13 编辑 ]

crackiss 发表于 2009-5-25 10:17:29

楼上可怜了。。
加密那个 正书上有 为以前看过 不过已经忘记了
打算自己不看书搞一遍 再回去对照

Nisy 发表于 2009-5-25 10:22:45

日期:2009-5-25
10:09:40
我的想法就是,如果开的太大,而实际用的很小,就太浪费内存空间了
10:09:53
我的怎么可以运行小写的啊
Nisy(3317759) 10:10:09
哦 你说的是输入的时候 根据输入的长度 开空间呀
Nisy(3317759) 10:10:13
那不行的 输入的字符必须要放入我们申请的合法空间 动态申请的或静态申请的 否则输入的字符错误的存放到了 内存中系统数据的空间 程序将马上崩溃

10:14:17
赋值语句可以直接把\0传递过去,memcpy()不行
10:14:48
memcpy 是内存COPY只和长度有关 和其他什么字符之类的一点关系也没有

10:17:33
嗯,老大,你程序里的strlen(str)+1完全可以用sizeof(str)代替吧?那样就自动把\0传递过去了,对吧
Nisy(3317759)10:18:02
sizeof(str) 你试试 计算机语言之所以一定可以学会 就在于 答案就在你的手下

suiyunonghen 发表于 2009-5-25 12:48:21

strlen的实现方式是检测\0
int strlen(char *p)
{
int res=0;
while(*p++!='\0')
    res++;
return res;
}

加密的加三是加密,那么反向-3应该就是解密,所以其实一个函数就可以了。
页: [1]
查看完整版本: 第七课字符加密中的一个问题