| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 893 人关注过本帖
标题:大神们看看,这个while中的j+=2;错在那儿
取消只看楼主 加入收藏
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
大神们看看,这个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
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
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
回复 8楼 有容就大
怎么会没有问题呢?我的就退不出循环!!!我也试了把
你酬洲
输入文本文件,还是一样...
2012-08-10 12:31
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
回复 10楼 有容就大
有,循环运行了不知多久会停止,可能是碰到了内存其他的地方的'\0'
2012-08-10 12:47
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

谢谢各位的回答,我终于找到问题所在了,读文件结束后我把str[i]='\0';改成了str[--i]='\0';就OK了,我想应该是ifstream的file.get()函数返回值的问题。
上图是未改之前的输出截图,里面顶上是文本文档全选后的样子,下面黑的是程序测试,第三行末尾"_"是我加的,以标示字符串终结位置,cout<<str<<'_'<<endl;。利用第四行的标尺,一看就不对:源文件只有22长度,读取后却成了total=23,而且更诡异的是,程序把'n'后面多出来的不知道什么东西(暂且称为'x',判断应该是str[j]<0的)和最末尾的'\0'合成一个中文字符输出(因为系统就是这样的,只要是第8位为1,则连同后面的字符一起合成一个中文字符显示,这里因为合成的编码不在中文字库中,因此显示不出来,但占两个字节),但末尾的'\0'仍旧起结束字符串的作用,这样'\0'被变相输出,所以字符串结尾'_'在24的位置。常理输出是'\0'不输出,'_'应该在'n'后面的,也就是22的位置。这样在循环中,j指向'x'时,由于str[[j]<0,进入第一个条件,j+=2;,刚好跳过'\0',完了就越界了。而用j++; if (j!=i) j++;这样的话,j++后由于j==i,就不再加了,此时j刚好指向'\0',循环就结束了。
2012-08-10 17:03
快速回复:大神们看看,这个while中的j+=2;错在那儿
数据加载中...
 
   



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

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