一个文本字段的处理,进入到死循环了,本人错在哪里? 求指导

C++语言 码拜 9年前 (2016-04-18) 813次浏览
希望程序可以把:
<YB><CB><ZZ><XX><><VV><><NN><MM><AA><SS><DD><FF><GG><HH><JJYYY><KK><></DX><QQ><WWW><EE><TT><YY>
这样的字符串
处理成:
<YB>
<CB>
<ZZ>
<XX>
<><VV><><NN>
<MM>
<AA>
<SS>
<DD>
<FF>
<GG>
<HH>
<JJYYY><KK><></DX>
<QQ><WWW><EE>
<TT>
<YY>
这样、、、
有问题的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
fstream InFile;
string bufferstr,strA,strB;
int LineCount = 0;
int repeatCount = 0;
int PosA = 0;
int PosB = 0;
string targetStr = "><";
int main()
{
		InFile.open("test.xml",ios::in);
		while(getline(InFile,bufferstr))
		{
			while(bufferstr.find(targetStr,0) != -1)
			{
				PosA = bufferstr.find(targetStr,0);
				if((bufferstr.substr(PosA + targetStr.length() + 2,1) == ">"))
				{
					bufferstr.insert(PosA + 1,"\n");
				}
			}
		cout << "line is:" << LineCount +1 << "\n";
		cout << "处理过的bufferstr:" << bufferstr << " \n\n";
		LineCount++;
		}
	InFile.close();
	return 0;
}
解决方案

5

第二层循环里面bufferstr内容是不变的,所以while条件永真。
if语句改为bufferstr = bufferstr.insert(PosA + 1,”\n”);  再试一下。

10

第二层循环中你bufferstr应该一直没变,里面的if也没被执行到

10

利用PosA来记录已经扫描过的位置
if((bufferstr.substr(PosB + targetStr.length() + 2,1) == “>”))这个逻辑有点不太懂
只有当找到”><“的位置的后面的第四个字符是”>”你才插入回车符,但又和题主贴出来想要达到的结果不太一样啊?

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
 
using namespace std;
 
fstream InFile;
string bufferstr,strA,strB;
int LineCount = 0;
int repeatCount = 0;
int PosA = 0;
int PosB = 0;
 
string targetStr = "><";
 
 
int main()
{
        InFile.open("test.xml",ios::in);
 
        while(getline(InFile,bufferstr))
        {
            while(bufferstr.find(targetStr,PosA) != -1)
            {                       
                PosB = bufferstr.find(targetStr,PosA);
                if((bufferstr.substr(PosB + targetStr.length() + 2,1) == ">"))
                {
                    bufferstr.insert(PosB + 1,"\n");  
					PosA += 4;
                }
				else
					PosA++;
            }
 
        cout << "line is:" << LineCount +1 << "\n";
        cout << "处理过的bufferstr:" << bufferstr << " \n\n";
        LineCount++;
        }
 
    InFile.close();
    return 0;
}

25

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//…
if (条件2) continue;
//…
if (条件3) return;
//…
}
原因是前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
a=fgetc(f);
//…
b=fgetc(f);//可能此时已经feof了!
//…
}
而这样写就没有问题:
while (1) {
a=fgetc(f);
if (feof(f)) break;
//…
b=fgetc(f);
if (feof(f)) break;
//…
}
相似的例子还可以举很多。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个文本字段的处理,进入到死循环了,本人错在哪里? 求指导
喜欢 (0)
[1034331897@qq.com]
分享 (0)