查看: 1437|回复: 8
|
find() in C++
[复制链接]
|
|
#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
void main(){
string str;
str="try to learn find method.hope can master it.";
int position=str.find("r");
while (position!=string::npos){
str.replace(position,1,"e");
position=str.find("r",position+1);
}
cout<<"answer is : "<<str;
getch();
}
我不明白position=str.find("r",position+1);
position+1 是什么。在find()的parameter 是什么
|
|
|
|
|
|
|
|
发表于 19-3-2013 11:29 AM
|
显示全部楼层
把Cursor移动到string.find()那里,按下F1键,自己看。
再不然就是去Google.com,输入string.find(),自己看。 |
|
|
|
|
|
|
|
发表于 19-3-2013 02:29 PM
|
显示全部楼层
首先,你明白LOOPING吗?什么是LOOPING CONDITION吗?
你明白String.find() 是return什么吗?
你明白什么是PARAMETER吗?
你需要明白这些,就能知道你问的CODING是怎样了。
|
|
|
|
|
|
|
|

楼主 |
发表于 22-3-2013 11:53 PM
|
显示全部楼层
天魔神 发表于 19-3-2013 02:29 PM 
首先,你明白LOOPING吗?什么是LOOPING CONDITION吗?
你明白String.find() 是return什么吗?
你明白什么 ...
我 明白looping 是什么.string.find() 是search string 或charater。这是我在google search 找到的string (1) | size_t find (const string& str, size_t pos = 0) const; | c-string (2) | size_t find (const char* s, size_t pos = 0) const; | buffer (3) | size_t find (const char* s, size_t pos, size_t n) const; | character (4) | size_t find (char c, size_t pos = 0) const; |
我不明白这里position=str.find("r",position+1);
为什么要position + 1.
我把它换成position。得到的答案是一样的。
|
|
|
|
|
|
|
|
发表于 23-3-2013 01:32 AM
|
显示全部楼层
你确定你放POSITION,没有+1,可以RUN?
你的例子我简单化,就是
position = 1
while(position != -1){
position;
}
你POSITION都没有变动,你的WHILE要RUN到几时呢?你的WHILE就永远停在那里了啊
这个:
str="try to learn find method.hope can master it.";
int position=str.find("r");
代表
"try to learn find method.hope can master it." 的句子,第一个R在那里?
所以呢,str.find("r")就去找R,没错的话,第一个R是在位置1 (因为ARRAY是START FROM 0)
这时候,int position=str.find("r") 就把value 1 store进 position里面。所以现在position = 1
while (position!=string::npos){ <<<<这个的意思是当position不等于 -1 , 因为string::npos是return -1
str.replace(position,1,"e"); <<<<这个不重要,暂时不解释
position=str.find("r",position+1);
}
position=str.find("r",position+1); <<重点, str.find("r",position+1) , 为什么呢?这等于是str.find("r",2) 因为position + 1 = 2
所以str.find("r",position+1) , 就是说,"try to learn find method.hope can master it." 从第2个位置,就是Y算起,第一个R是在那里?答案就在第10个位置 (include空行),所以这时候position 的value就变成10了,又LOOP回WHILE,因为POSITION还不等于-1,以此类推的话,当find()找不到R的时候,就会RETURN -1了,这时候WHILE的LOOPING就结束了。
|
|
|
|
|
|
|
|
发表于 28-3-2013 12:33 PM
|
显示全部楼层
再次强烈哀嚎哭求大家,post 代码上来求教时请善用 [ code ] [ /code ] 代码标注功能(也就是你发文时上面的Menu里面的 < > 图标),并且,好好的Format你的代码,别让人看到两眼昏花了,好不好?- #include<iostream>
- #include<conio.h>
- #include<string>
- using namespace std;
- void main()
- {
- string str = "try to learn find method.hope can master it.";
- int position=str.find("r");
- while(position!=string::npos)
- {
- str.replace(position,1,"e");
- position=str.find("r", position + 1);
- }
- cout<<"answer is : "<<str;
- getch();
- }
复制代码 这个程式的目的是让你扫描你的str字串,寻找 r 字母的位置,并将其置换成 e 字母。整个字串里面有3个 r 字母 (try, learn, master)。- int position=str.find("r");
复制代码 这行进行了第一次扫描,使用的是find()的variant,只接受一个Argument(你要搜寻的字串Pattern,也就是 “r”),同时默认搜寻的起始位置是0(从字串的第一个字母开始搜寻)。
很自然的,这个指令的结果就是找到了 try 里面的 r 并 return 了这个 r 的位置,也就是 1。
然后,程式进入While-Loop,在没有碰到npos(end of string)的情形下,持续搜寻 “r”。这次,程式使用了find()的另一个variant find(string pattern, int start_position)。
至于为何要position+1?因为现在position=1,也就是指着 try 里的 r,position+1 就是让程式从(c_str)str[2],也就是 try 里面的 y 开始搜寻,略过已经被搜寻到的第一个 r。
然后再重复,这次是从 learn 的 r 之后,也就是 n 开始搜寻。
再次搜寻,找到 master 里面的 r。
然后就碰到npos搜寻结束。
程式打印出被更改过的 str。
结束。
明白了吗?逻辑思考很重要。 本帖最后由 geekman 于 28-3-2013 12:36 PM 编辑
|
|
|
|
|
|
|
|
发表于 28-3-2013 04:40 PM
|
显示全部楼层
楼主的方法也是可以的,因为每次搜寻到 r 就会当场将其置换为 e,在第一次搜寻找到的 r (try,position = 1)经过置换后,里面已经不是 r 而是 e 了。不过如果没有进行置换,楼主的程式就会永远卡在第一个 r 那里。 |
|
|
|
|
|
|
|

楼主 |
发表于 3-4-2013 02:29 PM
|
显示全部楼层
geekman 发表于 28-3-2013 12:33 PM 
再次强烈哀嚎哭求大家,post 代码上来求教时请善用 [ code ] [ /code ] 代码标注功能(也就是你发文时上面的 ...
thanks for your help |
|
|
|
|
|
|
|
发表于 25-5-2013 06:13 PM
|
显示全部楼层
很简单,为什么position+1,因为程序第一次寻找“r”后,返回r在串里的位子,如果第二次执行find函数的时候,把position+1是为了从r下一个字符开始找另一个r。然后replace想要的字符。
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|