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 实现(蛮力搜索)
C++ std::string::find()函数(在字符串中查找内容)
C++中std::string::find_last_of用法
C++ std::string::find_first_of()函数(在字符串中搜索与其参数中指定的任何字符匹配的第一个字符)