我需要制作一个程序,它将接受一个程序,去除它所有的 //
和 /* */
注释,最后将它发送到一个新文件.
我遇到的问题是我无法弄清楚如何通过注释行末尾的 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/