图片附件: 游客没有浏览图片的权限,请
登录 或
注册
谢谢各位的回答,我终于找到问题所在了,读文件结束后我把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',循环就结束了。