c++ - 删除从 i 到行尾的字符串的一部分

标签 c++ string

我需要制作一个程序,它将接受一个程序,去除它所有的 ///* */ 注释,最后将它发送到一个新文件.

我遇到的问题是我无法弄清楚如何通过注释行末尾的 s.erase 结束对字符串中字符的删除。我将整个程序输入到一个字符串中,现在我必须找到并删除注释。

while (!(filein.eof()))
{
    ch=filein.get();
    s.insert(i,1,ch);
    i++;
}
for (i=0;i<s.length();i++)
{
    if((s.at(i) == '/') && (s.at(i+1) == '/'))
    {
        s.erase(i, '\n');
    }
}

我认为 s.erase(i, '\n') 会起作用,但它只会删除前 10 个字符。

最佳答案

字符转义文字'\n'的ASCII码等于10,所以调用

s.erase(i, '\n')

表示从位置i开始删除10个字符。

你需要如下内容

#include <iostream>
#include <string>

int main()
{
    std::string s( "// This is a comment\n a + b/* it is a sum */= c" );

    std::cout << "\"" << s << "\"" << std::endl;

    typedef std::string::size_type size_type;

    if ( s.length() > 1 )
    {
        for ( size_type i = 0; i < s.length() - 1; i++ )
        {
            if ( s[i] == '/' )
            {
                if ( s[i+1] == '/' )
                { 
                    size_type n = s.find( '\n', i + 2 );
                    n = n == std::string::npos ? s.length() - i : n - i + 1; 
                    s.erase( i, n );
                }
                else if ( s[i+1] == '*' )
                { 
                    size_type n = s.find( "*/", i + 2 );
                    n = n == std::string::npos ? s.length() - i : n - i + 2; 
                    s.replace( i, n, 1, ' ' );
                }
            }
        }
    }
    std::cout << "\"" << s << "\"" << std::endl;
}

输出是

"// This is a comment
 a + b/* it is a sum */= c"
" a + b = c"

考虑到这段代码忽略了一个反斜杠字符 (\) 紧接着一个换行符,该换行符被预处理器删除,拼接物理源代码行以形成逻辑源代码行。

关于c++ - 删除从 i 到行尾的字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363933/

相关文章:

java - 字符串操作,修改原始字符串的 subString() 方法

c++ - 字符串替换成几种组合

c++ - 指向局部变量的指针存储在该变量的范围之外

c++ - CGAL表面网格-修改顶点坐标

c++ - 任意数量的任意类型的参数

c++ - shared_ptr 删除结构内的对象

sql - 在 SQL Server 中修剪前导零的更好技术?

python - 将 csv 文件中相似的句子字符串分组在一起

C语言。如何在 SCANF 中使用字符串值作为分隔符

c++ - C++ 中的 STL 它是如何工作的