2010-12-14 10 views
5

だから私は、文字列を持っているとスラッシュ:後方に交換するC++での前方スラッシュまたはダブルバックスラッシュ

C:/Users/Richard/Documents/Visual Studio 2010/Projects/Client/Debug 
:私はそれがどのように見えるように、前方のもので、その中にすべてのバックスラッシュを置き換えたい

string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

これは動作しません:

明らか
string toReplace = "\\"; 
path.replace(path.find(toReplace), toReplace.length(), "/"); 

、それはおそらく番目の原因になっているので、\はエスケープ文字ですeの問題。

+0

どのように正しく機能しないのですか? –

+0

試してみるとどうなりますか? –

答えて

13

無効なエスケープコードが含まれているため、path文字列のg ++​​でコンパイラエラーが発生します。どうやら、MSVCは警告を出しますが、エラーはありません(Michael Burrの答えを参照)。だから実際に投稿したpathを使用している場合は、バックスラッシュを二重バックスラッシュに変更してください。

あなたのコードは、最初のバックスラッシュだけを置き換えて残りのコードを置き換えることがわかりました。たぶん、あなたはそうのように、std::replace()を使用したい:

std::replace(path.begin(), path.end(), '\\', '/'); 
+4

私はそれがうまくいくとは思わない。 'std :: replace'は\文字を探しますが、コンパイラは各\をそれの後にある文字のエスケープ文字に解釈するので、文字列内には何も見つかりません。 – Maxpm

+1

@Maxpm、この答えは、単一の文字の検索/置換を行うための最良の方法です。しかし、これが機能するには、OPによって提供される実際の文字列を適切にエスケープする必要があることに注意してください。 –

+0

g ++を呼び出すためのスクリプトに設定したオプションを使ってGCC(MinGW with GCC 4.5.1)をインストールしました(おそらく唯一のものです)。ここでは無効な '\ U'エスケープシーケンスしかエラーとみなされません。他のすべてはただの警告です。 VCはすべての警告を考慮します。 –

9

あなたはこのような何かを持っている場合:

string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

「\」でに操作をすべての文字が特殊文字、それをあります。正しい方法は

string path = "C:\\Users\\Richard\\Documents\\Visual Studio 2010\\Projects\\Client\\Debug"; 

フレッドが言ったようにstd :: replaceを使用してください。

2

ソースファイルの "string path = ..."は表示されていますか?そうであれば、置換するバックスラッシュはありません。

以下のプログラム:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string path = "C:\Users\Richard\Documents\Visual Studio 2010\Projects\Client\Debug"; 

    cout << path; 
} 

出力:

C:UsersRichardDocumentsVisual Studio 2010ProjectsClientDebug 

注:上記のプログラムのコンパイル(警告の束を有する)MSVCに(VS2010を介して)が、GCCと4.5.1エラーが発生する:

C:\temp\test.cpp:8:19: error: incomplete universal character name \U 

このエラー(またはその点についてはGCC)のMSVCの動作は、適切なオプションで設定可能です。

2

私が知る限り、指定した文字列からこれを行う方法はありません。あなたのコードでは、文字をエスケープしようとしているURDVPなど

文字列がハードコードされている場合は、ダブルスラッシュを使用する必要があります(つまり、C:\\Users\\Richard...)。

文字列が、たとえばユーザーが入力するパスの場合は、エスケープ文字をプログラムで追加することができます。

+2

文字列がユーザー入力の場合、何もエスケープする必要はありません。 – UncleBens

0

文字列を使用してください。findfirsof( '\');