リテラルファイルパス(C:/example.txt)をさまざまなWinAPIレジストリ関数(C://example.txt)と互換性のあるものに変換する必要がありますが、それを実行する方法がわかりません。
特定の文字(この場合は/)の後にバックスラッシュを追加する必要があることに分解しましたが、その後は完全にスタックしています。
ガイダンスとコード例は大歓迎です。
私はC++とVS2012を使用しています。
リテラルファイルパス(C:/example.txt)をさまざまなWinAPIレジストリ関数(C://example.txt)と互換性のあるものに変換する必要がありますが、それを実行する方法がわかりません。
特定の文字(この場合は/)の後にバックスラッシュを追加する必要があることに分解しましたが、その後は完全にスタックしています。
ガイダンスとコード例は大歓迎です。
私はC++とVS2012を使用しています。
\\は2文字ではなく、1文字です:
for(size_t i = 0, sz = sPath.size() ; i < sz ; i++)
if(sPath[i]=='/') sPath[i] = '\\';
ただし、一部のAPIは\で動作し、一部は/で動作するため、この置換を使用する場合を確認する必要があることに注意してください。
C ++では、文字列はのような個々の文字で構成され"foo"
ます。文字列は、アルファベットの文字などの印刷可能な文字、またはエンターキーやその他の制御文字などの印刷不可能な文字で構成できます。
文字列を入力するときに、これらの印刷不可能な文字の1つを通常の方法で入力することはできません。たとえば、「foo」、「tab」、「bar」の順に含まれる文字列が必要な場合、次のように入力してこれを作成することはできません。
foo
TABbar
これは単にその数のスペースを挿入するだけなので、実際にはTAB文字は挿入されません。
これらの印刷不可能な文字を「エスケープ」することで指定できます。これは、バックスラッシュ文字(\
)の後に文字のコードを挿入することによって行われます。上記の文字列の場合TAB、エスケープシーケンスで表されるため、次の\t
ように記述します"foo\tbar"
。
文字\
自体は印刷不可能な文字ではありませんが、C ++(およびC)はそれを特殊であると認識します。これは、常にエスケープシーケンスの開始を示します。文字列に「\」という文字を含めるには、それ自体を。でエスケープする必要があり\\
ます。
したがって、C ++では、次を含む文字列が必要な場合:
c:\ windows \ foo \ bar
エスケープシーケンスを使用してこれをコーディングします。
string s = "c:\\windows\\foo\\bar"
スラッシュのすべての出現を2つのバックスラッシュに置き換えることが本当に必要な場合は、これでうまくいくはずです。
size_t i = str.find('/');
while (i != string::npos)
{
string part1 = str.substr(0, i);
string part2 = str.substr(i + 1);
str = part1 + R"(\\)" + part2; // Use "\\\\" instead of R"(\\)" if your compiler doesn't support C++11's raw string literals
i = str.find('/', i + 1);
}
編集:
PS私が質問を誤解し、あなたの意図が実際にすべてのスラッシュを1つのバックスラッシュに置き換えることである場合、より簡単で効率的な解決策があります(@RemyLebeauがコメントで指摘しているように):
size_t i = str.find('/');
while (i != string::npos)
{
str[i] = '\\';
i = str.find('/', i + 1);
}
または、さらに良い:
std::replace_if(str.begin(), str.end(), [] (char c) { return (c == '/'); }, '\\');