| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 893 人关注过本帖
标题:大神们看看,这个while中的j+=2;错在那儿
只看楼主 加入收藏
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
大神们看看,这个while中的j+=2;错在那儿
程序代码:
#include<iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{

 int i=0;

 int j=0;

 int k;

 char a;

 char s[3];

 char str[2000];

 char ss[]="";

 ifstream file("实验文本.txt");

 while(!file.eof())            

 {
  str[i++]=file.get();

 };

 str[i]='\0';

 while(str[j]!='\0')

 {
  if(str[j]<0)           
  {
   s[0]=str[j];
   s[1]=str[j+1];
   s[2]='\0';
   cout<<s<<endl;
   if(!strcmp(ss,s))
   {
    k=j;
    cout<<"找到相应汉字且位置为"<<k<<endl;
   }
   j++;
   if (j!=i)
       j++;
  }
  else
   j++;

 }

 system("pause");
}
上面是能正确运行的程序,环境VC6.0
大神们看看,为什么我把红色代码
j++;
if (j!=i)
    j++;
这句改成
j+=2;
就不能成功终止循环呢?一直显示“烫”,不知道运行了多久,然后显示“$",停止了。
例如,对于这样的文件
ddwdawdwad你好亚洲dawdawda
按理说,前面都是j++,然后指向“你”,之后j+=2,指向“好”,j+=2.....以此类推,到“洲”时,j+=2,正好指向“d”,后面都是j++,到'\0'时判断str[j]!='\0'不成立,终止循环。中文字符都是高低字节成对出现,j+=2为什么会出现越界的情况呢?
另外考虑,如果i=10,此时如果j=9,那么j指向的一定不是中文字符(如果是中文字符,肯定是指向高字节,那么还有个低字节在str[10]的位置,和假设矛盾),因此不会有j+=2;只能是j++,此后j=10,str[j]=='\0',终止循环。
逻辑是没有什么错,但为什么运行起来就是不对呢?望指教!!!!!
搜索更多相关主题的帖子: color 
2012-08-09 16:54
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:5 
……有那么多j++ 你改几个还是只改一个  改那个?

还有就是为什么你能用if(str[j]<0) 这个条件来执行寻求字符的操作 难道字符数组存的字符的值都小于0?
大于0会是什么东西?

梅尚程荀
马谭杨奚







                                                       
2012-08-09 22:34
ldzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:64
专家分:339
注 册:2012-7-30
收藏
得分:5 
经测试汉字确实可以用if(str[j]<0) 这个条件来判断 大于零就是一般字符了
j++;if (j!=i)j++;我看是判断到数组结尾的。但是如楼主所说一个汉字占了数组两个单元,j+=2;也不会跳到数组外,不知道有什么没想到,还是没理解。
所以我没明白,坐等大神解释。
2012-08-09 23:33
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
显示 烫 肯定是越界了。楼主可以监视一下 j 的值,看看什么时候越的界。
2012-08-09 23:54
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:5 
VC6测试没问题!

★★★★★为人民服务★★★★★
2012-08-10 00:22
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
回复 2楼 有容就大
中文字符高字节的的第8位是1,也就是说如果用整数表示的话它是小于0的,而一般ASCII字符第8位是0,是大于等于0的。我也可以用if (str[j]&0x80)来判断的,也就是判断第8位是不是1。改j++就是该if (str[j]<0)这个条件里面的j++; if (j!=i) j++;这句,只改这一个。
2012-08-10 09:07
lyswwr
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:124
注 册:2011-7-3
收藏
得分:0 
路过~~~
2012-08-10 09:21
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 6楼 stophin
学习了  不过把那个j++改成j+=2后 我的程序可以正常运行 终止循环 得到结果
图片附件: 游客没有浏览图片的权限,请 登录注册


梅尚程荀
马谭杨奚







                                                       
2012-08-10 10:39
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
回复 8楼 有容就大
怎么会没有问题呢?我的就退不出循环!!!我也试了把
你酬洲
输入文本文件,还是一样...
2012-08-10 12:31
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 stophin
没有press anykey to continue?

梅尚程荀
马谭杨奚







                                                       
2012-08-10 12:33
快速回复:大神们看看,这个while中的j+=2;错在那儿
数据加载中...
 
   



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

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