std::string::find 总是返回 string::npos 甚至

Posted

技术标签:

【中文标题】std::string::find 总是返回 string::npos 甚至【英文标题】:std::string::find always returns string::npos even 【发布时间】:2017-06-11 19:48:40 【问题描述】:

std::string::find 总是返回 string::npos 即使它应该找到一些东西。在这种情况下,我试图找到一个 后跟一个新行。但是不管我放什么字符串,它都找不到。

pos=0;
while(pos!=string::npos)

    ko=input.find("\n"); //here is the problem!!!
    if(ko!=string::npos && input[ko]=='\n')
    
        input.erase(ko, 3);
        kc=input.find("", ko);
        for(pos=input.find("\",", ko); pos<kc; pos=input.find("\",\n", pos))
        
            input.erase(pos, 4);
            input.insert(pos, " | ");
        
        pos=input.find("\"\n", ko);
        input.erase(pos, 3);
    
    else
    
        break;
    

pos=0;
cn=1;
for(pos=input.find("\"", pos); pos!=string::npos; pos=input.find("\"", pos))

    input.erase(pos,1);
    if(cn)
    
        input.insert(pos,"R");
    
    cn=1-cn;

这是输入的一部分:

-- declaring identifiers of state and final states
Detecting_SIDS = 
    "Detecting",
    "Detecting_CleanAir",
    "Detecting_GasPresent"


-- declaring identifiers of transitions
Detecting_TIDS = 
    "__NULLTRANSITION__",
    "Detecting_t2",
    "Detecting_t3",
    "Detecting_t4",
    "Detecting_t5"

这段代码应该把上面的输入变成如下:

-- declaring identifiers of state and final states
datatype Detecting_SIDS = RDetecting | RDetecting_CleanAir | RDetecting_GasPresent

-- declaring identifiers of transitions
datatype Detecting_TIDS = RNT | RDetecting_t2 | RDetecting_t3 | RDetecting_t4 | RDetecting_t5

【问题讨论】:

如果它找到了一些东西,那么input[ko] 将等于,而不是\n。你给它一个总是错误的条件。 假设一个总是“我可能做错了什么”。你确实做到了。阅读std::find 返回的内容。 糟糕,&& input[ko]=='\n' 是有罪的。我做了一些调试,却忘了把它取下来。谢谢@krzaq @RafaelMarinho 为什么我觉得你试图用你的代码完成的事情可以通过调用 STL 算法函数而不是棘手的 erase() 在循环? 【参考方案1】:

我认为您应该使用std::find_first_of 算法遍历输入。来自 this 的返回是一个积分器,因此您的循环应该在等于 std::end(input) 时退出。使用此迭代器,您可以提前查看以下字符是否是您的 '\n'。

这是未编译的代码,仅供参考:

auto ptr = std::begin(input);
auto end = std::end(input);

while(ptr != end) 

    ptr = std::find_first_of(ptr, end, '' );

    if (ptr == end)
        break;

    else if (++ptr == end)
        break;

    else if (*ptr == '\n)
    
        //Do Processing//
    

【讨论】:

以上是关于std::string::find 总是返回 string::npos 甚至的主要内容,如果未能解决你的问题,请参考以下文章

不区分大小写的 std::string.find()

不区分大小写的 std::string.find()

自己的 std::string::find 实现(蛮力搜索)

C++ std::string::find()函数(在字符串中查找内容)

C++中std::string::find_last_of用法

C++ std::string::find_first_of()函数(在字符串中搜索与其参数中指定的任何字符匹配的第一个字符)