0

引数をスペース区切り文字として受け入れる静的ライブラリが与えられました。

ライブラリのメソッド

int saveFile(char* param);

保存先のドキュメントファイルパスを渡します

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
std::string str = [documentsDirectory cStringUsingEncoding:[NSString defaultCStringEncoding]];
const char * filePath = str.c_str();
char pa[1024];
pa[0] = 0;
strcat(pa, filePath);
saveFile(pa);

私の問題は、IOSファイルパスにスペースが含まれているため、ライブラリがそれらの場所でパスを分割することです。スペースを「\」でエスケープしようとしましたが、もちろん、この場合、パスを引用符で囲むことはできません。たとえば、以下...

/Users/bigbadowl/Library/Application Support/iPhone Simulator/5.1/Applications/649D2EEB-8C88-42C7-9A74-21629570B1D0/Documents

に分割されます

/Users/bigbadowl/Library/Application
Support/iPhone
Simulator/5.1/Applications/649D2EEB-8C88-42C7-9A74-21629570B1D0/Documents

任意のアイデアをいただければ幸いです。

ありがとう

4

2 に答える 2

0

1つの解決策は、元の文字列のスペースを使用される可能性の低い文字(など#)に置き換え、ライブラリ操作を実行してから、この文字のすべての出現箇所をスペースに戻すことです。次のようなもの:

// ...
std::replace(str .begin(), str .end(), ' ', '#');  // Replace spaces with #
const char * filePath = str.c_str();
char pa[1024] = {0};
strcat(pa, str.c_str());
std::replace(str .begin(), str .end(), '#', ' ');  // Replace # with spaces
// ...

もちろん、元の文字列にこの文字が含まれていると、目的の動作は得られません。いつでもこれをテストして別のキャラクターを選択できるので、これは問題にはなりません。

于 2012-07-13T22:36:41.623 に答える
0

これはシミュレーターでのみ問題になると思います。saveFileに変更を加えることができない場合は、シミュレーターをだますことができるかどうかを確認する必要があります。

/Users/bigbadowl/Library/Application Support/iPhone Simulatorテストとして、/Users/bigbadowl/namedにシンボリックリンクを作成できるかどうかを確認しますiphonesimLibrary/Application Support/iPhone Simulator次に、に置き換えiphonesimます。

/Users/bigbadowl/iphonesim/5.1/Applications/649D2EEB-8C88-42C7-9A74-21629570B1D0/Documentsスペースのないパスになります。それで動作するかどうかsaveFile()を確認してください。

幸運を祈ります。

于 2012-07-13T22:51:35.907 に答える