佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1437|回复: 8

find() in C++

[复制链接]
发表于 19-3-2013 02:09 AM | 显示全部楼层 |阅读模式
#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 是什么







回复

使用道具 举报


ADVERTISEMENT

发表于 19-3-2013 11:29 AM | 显示全部楼层
在find()的parameter 是什么


把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你的代码,别让人看到两眼昏花了,好不好?
  1. #include<iostream>
  2. #include<conio.h>
  3. #include<string>

  4. using namespace std;
  5. void main()
  6. {
  7.         string str = "try to learn find method.hope can master it.";
  8.         int position=str.find("r");

  9.         while(position!=string::npos)
  10.         {
  11.                 str.replace(position,1,"e");
  12.                 position=str.find("r", position + 1);
  13.         }
  14.         cout<<"answer is : "<<str;
  15.         getch();
  16. }
复制代码
这个程式的目的是让你扫描你的str字串,寻找 r 字母的位置,并将其置换成 e 字母。整个字串里面有3个 r 字母 (try, learn, master)。
  1. 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 编辑

回复

使用道具 举报

Follow Us
发表于 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
回复

使用道具 举报


ADVERTISEMENT

发表于 25-5-2013 06:13 PM | 显示全部楼层
很简单,为什么position+1,因为程序第一次寻找“r”后,返回r在串里的位子,如果第二次执行find函数的时候,把position+1是为了从r下一个字符开始找另一个r。然后replace想要的字符。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-9-2025 11:24 PM , Processed in 0.133325 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表