在字符串对象中搜索换行符'\ n'

时间:2011-12-26 13:18:35

标签: c++

我有一个通用格式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);

6 个答案:

答案 0 :(得分:8)

“\ n”不是包含\后跟n的字符串。转义序列\n表示单个字符,您可以使用

查找
for (size_t i = 0; i < line.length(); i++)
     if (line[i] == '\n')
         // whatever

或旧的std::string::find

答案 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)

代码有几个问题:

  1. 如果您认为'\'和'n'是两个不同的字符,如果'\'位于代码的末尾,那么您将耗尽数组!如果i<n-1

  2. ,您需要设置为if条件
  3. '\'和'n'通常是一个字符,因此您需要测试line[i] == '\n'

  4. 你的i = i + 2是错误的,因为你总是通过for循环本身递增1,所以只有条件下的i ++才能正常

  5. 更基本的是,你究竟想要实现什么目标?你只是想从字符串中删除\ n吗?为什么不使用标准的字符串替换功能!!!!