2017-06-15 14 views
1

現在のインデックスがどこであっても、文字列から文字を削除する関数を実装しようとしています。以下は私がこれまで持っているものの骨格です。削除したい文字を文字列の末尾に回転し、ヌルターミネーターに置き換えようとしています。以下のコードは、実際にバッファーを回転させていないようですが、出力が "wrd"の代わりに "wor"になっているからです。C++でarrayの最後のn個の要素をローテートします

int main() { 
    char buffer[]="word"; 
    int currIndex=2; 
    int endIndex=strlen(buffer); 
    currIndex--; 
    endIndex--; 

    rotate(buffer+currIndex, 
     buffer+1, 
     buffer+strlen(buffer)); 
    buffer[endIndex]='\0'; 
    cout << buffer << endl; 

    return 0; 
} 
+1

あなたは 'のstd :: STRING'を使用することを許可されていますか? – AndyG

+0

私はあなたの説明を正確に理解していません。 'abcdef'を文字' e'で回転させたいとしましょう。期待される出力は 'efabcd'ですか?私は正しい? – ovanes

+0

あなたの入力で@ovanes私は 'abcdfe'を返すことを期待しています。最後のインデックスをヌルターミネータに設定した後、' abcdf'の最終出力を返します。 – UBears

答えて

1

はstdを使用::私はポインタについて考える必要はありませんので、文字列は、物事の方法より簡単に:また

std::string buffer="word"; 
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end()); 
buffer.resize(buffer.size()-1); 

Demo

、我々は、c-スタイルに固執することができます配列:

char buffer[]="word"; 
rotate(buffer+1, buffer+2, buffer+4); 
buffer[3] = '\0'; 

Demo2


std::rotate 3つの引数を指定できます。

template< class ForwardIt > 
ForwardIt rotate(ForwardIt first, ForwardIt n_first, ForwardIt last); 

firstは、あなたが回転左にしたい範囲の最初の要素です。

nfirstはあなたが回転した後範囲の開始時になりたいな要素である(これはアルゴリズム回数左回転させるには、効果的に伝えます)

lastは範囲あなたの最後の要素であります回転したい。

あなたのコード:

char buffer[]="word"; 
int currIndex=2; 
int endIndex=strlen(buffer); 
currIndex--; 
endIndex--; 
rotate(buffer+currIndex, 
    buffer+1, 
    buffer+strlen(buffer)); 
buffer[endIndex]='\0'; 

は実際には本当に近かったです。 2番目の引数が間違っているだけです。それは

rotate(buffer+currIndex, 
    buffer+2, 
    buffer+strlen(buffer)); 
buffer[endIndex]='\0'; 

されている必要がありますが、コードは確かにビットが増加し、デクリメントで書かれて混乱しました。

+4

私は周りの回転文字全体が問題のOPの提案された解決策の一部であると信じています。実際の解決策は[std :: string :: erase](http://en.cppreference.com/w/cpp/string/basic_string/erase)です。 – IInspectable

+0

ありがとうございました!解決策はもっと一般的です: 'rotate(buffer + currIndex、buffer + currIndex + 1、buffer + strlen(buffer));' – UBears

+0

@IInspectable:それは意味が馬鹿げています。箱の外で考える方法! (回答として、あなたは私からupvoteを保証しています) – AndyG

4

これは質問に答えるのではなく、むしろ根本的な問題を解決します。文字列から単一の文字を削除する。

ソリューションはstd::string::eraseクラスメンバのシンプルなアプリケーションです:

#include <string> 
#include <iostream> 

int main() { 
    std::string word{ "word" }; 
    std::string::size_type currIndex{ 2 }; 
    word.erase(currIndex, 1); 
    std::cout << word << std::endl; 
} 
関連する問題