| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 925 人关注过本帖
标题:小菜一碟给大家...
取消只看楼主 加入收藏
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
 问题点数:0 回复次数:5 
小菜一碟给大家...

作为初学者,有一个小问题想问问各位大牛...
for(i=0;i<40;i+=k)
for(j=0;j<k;j++)
{
if(s[i+j]!='\0')
s[i+j]=s[i+j]^m[j];
}
情况是这样子的..如果*s="turbo c",装在M[40]里面,有7个字符,现在为它加密,密码*S="abc",有3个字符.也就是上面的k=3......
对变量i来说,当i=6时
for(j=0;j<3;j++)
s[6]='c'!='\0',,,,执行s[6]=s[6]^m[0].....
然后,j++后,就成s[7]='\0'了,自然不执行了,j++后,s[8]=什么哟?
然后再次回到外循环.i=9....如此下去吗?但这时的s[i+j]=?
作为初学者,也许不该有此过多纠缠,但我想不通啊...
经过我努力,查得,如果是int a[]类型的.初值个数如果填不完的话,好像后面的自动充为0.
如果是char a[],类,填不满时好像是以空格自动填写的..
显然空格!='\0'啊,是不是要执行s[i+j]=s[i+j]^m[j]?
不要叫我去实验,已纪矣,运行正常,只是想不明其中过程,,,,
大鸟支持。。。


[此贴子已经被作者于2007-9-19 23:10:58编辑过]

搜索更多相关主题的帖子: 小菜 
2007-09-19 21:47
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
得分:0 
当i=6时
for(j=0;i<3;j++)
s[6]='c'!='\0',,,,执行s[6]=s[6]^m[0].....


那是不可能滴````6<3吗????



晕死...i=6时,,,,j=0,j<3,j++怎么不可能...*s是指向M[40]的

2007-09-19 22:49
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
得分:0 

现在郑重向楼上的道歉,确是笔误.
对不起了...
真是不好意思,真的对不住,误导了楼上的.现在已经改了
道歉..道歉


我还想说的是,这个程序是没错了,原代码是一个加密解密程序,能正常运行的.所以是不用改的,只是其中的问题,
我已经分析过了.
既是对的,就有对的理由,为什么运行不会出错啊?


下面是源代码,给大家分享..
#include "stdio.h"
#include "string.h"
main()
{
char s[40],m[8];
int i,j,k;
printf(" to code for the strings\n\n");
printf("please input the strings(less than 8 chars);");
gets(s);
printf("now code,please input the code:");
gets(m);
k=strlen(m);
for(i=0;i<40;i+=k)
for(j=0;j<k;j++)
{
if(s[i+j]!='\0')
s[i+j]=s[i+j]^m[j];
}
printf("the reulst:");
printf("%s\n",s);
printf("now to uncode:");
gets(m);
for(i=0;i<40;i+=k)
for(j=0;j<k;j++)
{
if(s[i+j]!='\0')
s[i+j]=s[i+j]^m[j];
}
printf("the strings are:\n");
printf("%s\n",s);
system("pause");
}


大家可以拿去运行一下,我试过的,能行得通..

[此贴子已经被作者于2007-9-19 23:17:52编辑过]

2007-09-19 23:16
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
得分:0 

我怎么就没想到跟踪进入去看下?
惭愧,,,,
现在算是明白了,这个家伙还真会一直进行下去..直到i>=40...
那为什么还能正确...
因为\0在作怪,虽然后面是以空格填了,当然\0!=空格,所以还是要执行if(s[i+j]!='\0')
s[i+j]=s[i+j]^m[j];
的.只不过对\o没执行的话,还是\o.
在printf(%S)语句中,遇到\o时就认为字符串已结束了.
当然结果也对了呀....
原来调试,不仅是用于修正错误,也可以跟踪,发现秘密哦.....
在此谢谢二楼的哥们......
thank you....

2007-09-20 00:01
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
得分:0 
for(i=0,j=0;s[i];++i)
{
while( (j<k) && (s[i]) )
s[i++]^=m[j++];
if(!s[i])break;
}
哥们你说得对,3楼的break语句只能跳出内层循环,因为break只能跳出一层嘛。
本来是不用改的,我已经解释过了,因为没有对\0字符加密,所以\0以后的操作实际上是无效的。
但是当然这样来说程序的效率就不高了。。
如果要改的话,就要在这里入手了。。。

但是对于兄弟上面的程序,我还是有点不明白:
初始化i=0,j=0;然后进行,while( (j<k) && (s[i]) )
s[i++]^=m[j++];
但是进行到j=k-1(即最后一次)i++,使得,i加了1,同样j也加了1,此时j=k.(当然这里的被加密的串比密码串长,也就是i>k的)所以还不至于s[i]=='\0'..
然的就不明了,,,,
到这里为此,内层完了一次了,,,,转到外面去,于是又要执行外层的i++,然后就使得中间必有一个字符会被跳过,是不是?
而且对于for语句来说,第二次不会再次执行i=0,j=0这一条的,因而j就无法归0
后面就都无法进行了。。。


大概就这些地方不太明白,,,
很久没有这么细致的分析过问题了,,,,,和楼上的哥们这一次交流,真是长了不少知识,,,这个朋友交定了。。
My QQ:715403491,麻烦加一下。。。



2007-09-20 13:22
喜雨
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-6-30
收藏
得分:0 

哥们,如果要提高效率,改一下,我倒是有一招,break跳不出,用goto...
如下,,,
for(i=0;i<40;i+=k)
for(j=0;j<k;j++)
{
if(s[i+j]!='\0')
s[i+j]=s[i+j]^m[j];
else
goto laber;
}
laber:;//注:这里的;不能少,表示一个空语句。。。
我跟踪进去过了,行得通的,到s[i+j]='\0'时,会自动跳出两层循环的。。。

2007-09-20 13:32
快速回复:小菜一碟给大家...
数据加载中...
 
   



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

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