std :: out_of_range在循环中使用字符串查找和替换时

时间:2016-12-29 15:23:53

标签: c++ string replace while-loop find

所以我有一项任务是将一个字符串中某些单词的出现转换为另一个字符串。但是出现这个错误的while循环的条件存在问题

  

在抛出' std :: out_of_range'

的实例后终止调用      

what():basic_string :: replace

     

此应用程序已请求Runtime以不寻常的方式终止它。有关更多信息,请联系应用程序的支持团队。进程返回3(0x3)执行时间:2.751 s

我的代码是:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string str2("three");
    string str("one three two four three three");
    while ( str.find(str2) != NULL ){
    str.replace(str.find(str2),str2.length(),"five");
    cout << str << endl; // i put it inside loop to see output
    }
    cout << str << endl;
    return 0;
}

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您正在检查str.find(str2)是否有将其与NULL进行比较的情况,但这是错误的,因为NULL是一个宏并不意味着它并且经常扩展进入0可以成为有效索引。您应该将其与std::string::npos进行比较。完成此更改后,您的代码将起作用。

编辑:std::string::npos在coliru上进行测试时对应18446744073709551615。所以这显然不是你字符串中的有效索引。

答案 1 :(得分:1)

这个条件

Response

没有意义,因为while ( str.find(str2) != NULL ){ 的调用可以返回不等于零的find。在这种情况下,代码具有未定义的行为。

您可以应用以下方法

std::string::npos

答案 2 :(得分:0)

这是因为str.find(str2)如果-1中不存在str2str会返回pos。您可以使用变量find来保存找到的位置,这样您就不需要重新调用#include <iostream> #include <string> using namespace std; int main () { string str2("three"); string str("one three two four three three"); int pos = str.find(str2); while (pos > 0) { str.replace(pos, str2.length(), "five"); pos = str.find(str2); cout << str << endl; // i put it inside loop to see output } cout << str << endl; return 0; } 函数。解决方案如下:

2016-12-29 16:05:21,230 | WARN  | elasticsearch[elk][generic][T#19] | transport.netty | 262 -  | [elk] exception caught on transport layer [[id: 0x9ffdafc0]], closing connection
java.nio.channels.UnresolvedAddressException
    at sun.nio.ch.Net.checkAddress(Net.java:101)[:1.8.0_111]
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622)[:1.8.0_111]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientSocketPipelineSink.connect(NioClientSocketPipelineSink.java:108)[262:]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientSocketPipelineSink.eventSunk(NioClientSocketPipelineSink.java:70)[262:]
    at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:574)[262:]
    at org.elasticsearch.common.netty.channel.Channels.connect(Channels.java:634)[262:]
    at org.elasticsearch.common.netty.channel.AbstractChannel.connect(AbstractChannel.java:216)[262:]
    at org.elasticsearch.common.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:229)[262:]
    at org.elasticsearch.common.netty.bootstrap.ClientBootstrap.connect(ClientBootstrap.java:182)[262:]
    at org.elasticsearch.transport.netty.NettyTransport.connectToChannelsLight(NettyTransport.java:787)[262:]
    at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:754)[262:]
    at org.elasticsearch.transport.netty.NettyTransport.connectToNodeLight(NettyTransport.java:726)[262:]
    at org.elasticsearch.transport.TransportService.connectToNodeLight(TransportService.java:220)[262:]
    at org.elasticsearch.client.transport.TransportClientNodesService$SimpleNodeSampler.doSample(TransportClientNodesService.java:369)[262:]
    at org.elasticsearch.client.transport.TransportClientNodesService$NodeSampler.sample(TransportClientNodesService.java:315)[262:]
    at org.elasticsearch.client.transport.TransportClientNodesService$ScheduledNodeSampler.run(TransportClientNodesService.java:348)[262:]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_111]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_111]
    at java.lang.Thread.run(Thread.java:745)[:1.8.0_111]