2016-11-23 7 views
-1

toupperを、それぞれchar.stringの後に使用したいと思います。 私はこのコードを試しましたが、私が+演算子を使用するとプログラムを起動すると黒い画面が表示されます。toantを行う文字列:: size_type + intを取得する

string fulltext = "my name is John. i have a girlfriend. her name is Anna"; 

string::size_type idx = 0; 
while ((idx = fulltext.find(".")) != string::npos) 
{ 
    if (idx != string::npos) 
    { 

     fulltext[idx + 2] = toupper(fulltext[idx + 2]); 
    } 
} 
cout << fulltext << endl; 
+3

"それは働いていない" を定義します。それに加えて、デバッガを使ってみましたか? –

+1

おそらく、idxがインクリメントされていないため、 "i have"の文字 "i"をupperに設定している無限ループを取得します。 idx = fulltext.find( "。"、idx + 1) – Nonanon

+1

また、コード内のいくつかの他の問題:1) 'if'節は同じ条件が' while '、あなたがループしている場合、それはすでに'真です。 2) 'idx'があなたの文字列中の有効なインデックスを表している場合、' idx + 2'が有効なインデックスを表すことは自動的には意味しません。 –

答えて

1

だから、toupperを使用する唯一の標準的な定義された方法はunsigned charを通過させることであることが判明:https://stackoverflow.com/a/37593205/2642059したがって、これを行うための最善の方法はtransformでラムダであり、たとえばあなたがstring fulltextを生かすことができそれは、このような全体です:

transform(cbegin(fulltext), cend(fulltext), begin(fulltext), [](const unsigned char idx){ return toupper(idx); }) 

あなたはiteratorの上の最初の'.'transform作品で開始したいので、あなただけにiteratorを取得するためにfindを使用することができます'.'と1 STと3 RD transform引数でそれを使用する:auto it = find(begin(fulltext), end(fulltext), '.')しかし、私たちは反復を逆にしなければ、我々は一時的に回避できます

transform(crbegin(fulltext), make_reverse_iterator(find(cbegin(fulltext), cend(fulltext), '.')), rbegin(fulltext), [](const unsigned char idx) { return toupper(idx); }); 

Live Example

関連する問題