删除一行中超过5个的标签

时间:2015-08-05 20:17:57

标签: c++ file whitespace getline

我正在尝试从网站中提取源代码片段,现在我想在每行中的标记之前删除所有空格和制表符。所以我把字符串复制到了一个字符串,现在我用每个行检查每个字符(也尝试过' \ t'''),直到有一些其他字符如&# 39;<'在计算有多少空格和标签时,哪一个并不重要。随后我创建了另一个char并将分隔符(行)写入其中,但在那里我只是跳过空格(使用[chars + i])。这种方法效果很好,但问题是如果有超过5个标签,那么它就不能正常工作。我完全不知道故障在哪里。

for(int i = 0;i < lines;i++){

    getline(codefile, buf);

    char *separator = new char[buf.size()+1];
    separator[buf.size()] = 0;
    memcpy(separator,buf.c_str(),buf.size());

    int chars = 0;

    for(int j = 0; j <= sizeof(separator); j++){

        if(isspace(separator[j])){
            chars++;    
        }
        else{
            break;
        }
    }

    char *newbuf= new char[buf.size()-chars+1];
    newbuf[buf.size()-chars] = 0;

    for(int k = 0; k <= buf.size()-chars+1; k++){
        newbuf[k] = separator[chars+k];
    }

    if(i > lcounter){
        cout << newbuf << i << endl;
    }

}

以下是该网站的源代码片段。您可以在图像标签,结束图标签和p标签上看到它。他们有超过5个标签(对不起,我必须审查它)。

<div class="xxx">

   <article class="xxx" data-id="0">
    <a href="link" class="tile" style="background-image:url('x.jpg');background-position:left center"  data-more="&lt;a href=x" data-clicks="&lt;i class=&quot;fa fa-eye&quot;&gt;&lt;/i&gt;" data-teaserimg="x.jpg">
    <time datetime="2015">
        <span>2015</span>
    </time>
    <h1 class="title">
        <span>x</span>
    </h1>
    <div class="x">x</div>
    <div class="x">x</div>      
    <div class="x">
        <figure class="x">
            <img src="x.jpg" width="1" height="1" alt="">
        </figure>
        <p>
            <strong>x</strong>xxx
        </p>
    </div>
</a>

抱歉,我无法发布图片,希望这是可以理解的。

1 个答案:

答案 0 :(得分:0)

sizeof(separator)应为strlen(separator)

sizeof是separator变量的大小,而不是字符串的长度。由于separatorchar*,因此这是四个字节。现在,您知道为什么当您有超过五个标签时,您的代码无法正常工作吗?

正如其他人指出的那样,没有理由将字符串复制到分隔符数组中。为什么不检查它们所在的角色? isspace(buf[j])isspace(separator[j])一样有效。