/*入力した文字列で!があったらすべて!?に置換するプログラムを作っています。
insertを使いたいのですが、うまくいかなくて困っています。
insert以外の部分はちゃんんとできていると思います。
c++を勉強し始めたばかりでよくわかっていませんので、ご教授お願いします。
*/
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int main(void) {
string a,s;
	cout <<文字列を入力してください<<endl;
	getline(cin,s);
int i,j=0;
	while( j!= s.npos) {
		i=s.find_first_of(!,j);
if(i==s.npos){
			cout << s.substr(j) << endl; 
			break;
		}
		if( i>0) {
			cout << s.substr(j, i-j);
			j=i;
		}
i=s.find_first_not_of(!,j);
		if( i== s.npos) {
			a=s.substr(j);
			j=i;
		}
		else{
			a=s.substr(j,i-j);
			j=i;
		}
		cout<< s.insert(a.c_str(),!?)<<endl;	
	}	return 0;
}
std::basic_string (std::sting) には replace というメンバーがあるし
std::replace っつ関数もあるわけだが(こっちは語長が変わる目的には使いづらい)
目的が「置換したい」のであれば自作せず素直に replace
目的が「自作したい」「insert が使いたい」のであればそう言ってくれ
とりあえず、replaceではなくて?
とりあえず、std::string::replaceではなくて?
# 書き込みミスった上に、内容かぶりました…すみませんorz
replaceは使わずにinsertで自分で作りたいです。
では、うまくいかないとはどういう状態になってるのか?を説明して
テケトー
#include <iostream>
#include <string>
int main()
{
    std::string input;
    std::cout << 文字列を入力してください << std::endl;
    std::getline(std::cin, input);
    std::string::size_type index = 0;
    while (index != std::string::npos)
    {
        index = input.find_first_of(!, index);
        if (index != std::string::npos)
        {
            ++index;
            input.insert(index, ?);
        }
    }
    std::cout << input.c_str() << std::endl;
    return 0;
}
>>ryo
今は、コンパイルは通って表示できるのですが、?を表示するときにループを抜け切れ
てなく、出力が止まらない状態です。
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
int main(void) {
string a,s;
    cout <<文字列を入力してください<<endl;
    getline(cin,s);
int i,j=0;
    while( j!= s.npos) {
        i=s.find_first_of(!,j);
if(i==s.npos){
            cout << s.substr(j) << endl; 
            break;
        }
        if( i>0) {
            cout << s.substr(j, i-j);
            j=i;
        }        	
		s.insert(i,?);	
		cout<<s.c_str()<<endl;
    }    
		return 0;
}
今回の要望に対しては find_first_of より find のほうが適切。
find : 与えられたオペランドシーケンスに一致する位置
find_first_of : 与えられたオペランドの要素のどれかに一致する位置
で、なにか難しく考えすぎなような気がする。
・文字列の終わりまでループする
・ ! をみつけたら、その直後に ? を挿入する
だけでいいわけで npos との判定を何度も行ったり substr 取ったりする必要はない。
挿入文字が1文字であり、挿入前文字と同じ文字を含まない前提で単純化したら
int main() {
  string s(WoW!! This!is a Text!);
  for (string::size_type p=0; (p=s.find('!', p))!=string::npos;) {
    ++p;
    s.insert(p, ?);
    ++p;
  }
  cout << s << endl;
  return 0;
}
挿入文字数が1文字より多い場合などは宿題にしておこう。
自作したいというので、質問者さんのソースについて
無限ループになってるのは
>i=s.find_first_of(!,j);
ここでみつけた!の位置そのままに?を挿入してるためです。
たとえば
t!t
この例から、!を見つけた場所に挿入すると文字列は
t?!t
となります。
次に
 j=i;
をしてから、j(=i)の位置から検索するということは
?を挿入したところから検索するということなので、
右にずれた「!」を再度検索することになります。
以降、これがずーっと繰り返されてしまいます。
ですので、
「見つけた場所」から「挿入すべき場所」に変えないといけません
http://oshiete1.goo.ne.jp/qa4990874.html
>発言される前に「使用上の注意」を必ずお読み下さい。
> マルチポストとは、「同じ内容の質問などを複数の掲示板等に書き込むこと」です。
この行為は
> マナー違反として嫌われています。マルチポストは行わないで下さい。
