我有一个通用格式string line = "yadayada\nyadaya"
的字符串对象。我循环遍历字符串,试图“捕捉”换行符。
for (int i = 1; i < line.length(); i++)
{
if ( ( line[i]== ' \ ') && ( line[i+1] == 'n' ) )
{
buffer.insertChar('\n');
i = i+2;
}
else
{
buffer.insertChar(line[i]);
}
}
正如你所看到的,我循环遍历字符串字符,我将字符逐个插入另一个名为buffer的对象(与问题无关)。
在第一个if if ( ( line[i]== ' \ ') && ( line[i+1] == 'n' ) )
我试图“捕捉”换行符并且在内部如果正在我将索引i递增2以便它将跳过字符'\'和'n'in下一个循环。问题是这个循环从不捕获换行符,但总是在缓冲区中插入两个单独的字符'\'和'n'。
重要说明:我以索引i = 1开始循环,因为第一个字符就像一个命令,正在被特殊处理。
更新:我修改了上面的代码,但仍然没有运气我想要完成的事情
for (int i = 1; i < line.length(); i++)
{
if ( (line[i]== '\n') )
{
buffer.insertChar('\n');
i = i+1;
}
else
{
buffer.insertChar(line[i]);
}
}
更新#2:如果这有助于字符串来自用户的输入,如下所示:
string line;
getline(cin,line);
答案 0 :(得分:8)
“\ n”不是包含\
后跟n
的字符串。转义序列\n
表示单个字符,您可以使用
for (size_t i = 0; i < line.length(); i++)
if (line[i] == '\n')
// whatever
答案 1 :(得分:2)
而不是( line[i]== ' \ ') && ( line[i+1] == 'n' )
,请尝试
if ( line[i]== '\n')
和
i = i+1;
答案 2 :(得分:2)
'\ n'是一个字符,而不是两个。
尝试:
if (line[i] == '\n') ...
答案 3 :(得分:1)
我不确定你是否正在搜索字符序列'\'加'n'或换行符(它在C源文件中的表示确实是\ n,但是它对应于一个字节!) ,但在这两种情况下,这应该没问题:
#include <iostream>
#include <string>
using namespace std;
int main() {
string pattern("\n"); //or, "\\n", so \n is actually '\' plus 'n'
string input="yadayada\nyayda\\nyadayada";
size_t index;
while((index=input.find_first_of(pattern))!=string::npos)
input=input.substr(0, index)+input.substr(index+pattern.size());
cout<<input;
}
此示例打印yadayadayayda\nyadayada
,这可能是您想要的。
答案 4 :(得分:0)
在string line = "yadayada\nyadaya"
中,"yadayada"
和"yadaya"
之间有一个字符。您的意思是"yadayada\\nyadaya"
,您要将其转换为"yadayada\nyadaya"
吗?
' \ '
应为'\\'
。我猜你试过'\'
,得到了一个编译器错误,并且想到你会尝试添加一些字符直到编译完成?这是个坏主意。 ' \ '
,如果它完全被编译器接受,将永远不会匹配。
还有一个问题:i = i+2;
使我增加2,但你转到i++
,所以你将i增加了3个。
答案 5 :(得分:0)
代码有几个问题:
如果您认为'\'和'n'是两个不同的字符,如果'\'位于代码的末尾,那么您将耗尽数组!如果i<n-1
'\'和'n'通常是一个字符,因此您需要测试line[i] == '\n'
。
你的i = i + 2是错误的,因为你总是通过for循环本身递增1,所以只有条件下的i ++才能正常
更基本的是,你究竟想要实现什么目标?你只是想从字符串中删除\ n吗?为什么不使用标准的字符串替换功能!!!!