0

C / C ++をいじってからしばらく経ち、char*を操作するために使用できる関数の記憶が消えてしまいました。

現在、次のコードを使用して現在の作業ディレクトリを取得しています...

char *path = NULL;
size_t size = 0;

path = _getcwd(path, size);
Msg("Current Working Directory: %s\n", path);

ただし、このパスを使用して、最後のディレクトリを切り取り、前のディレクトリにドロップする必要があります。現在、パスに「C:/ srcds / orangebox」のようなものが格納されており、正しいパスを取得するには、このディレクトリから最後のディレクトリを削除する必要があります。この場合、「C:/srcds」になります。

char *でこれを行うための最良の方法は何ですか?文字列の使用を提案しないでください。これは非常に簡単ですが、私が使用するSDKは、代わりにchar *を中心に展開しているため、読みやすくするためにこれを使用するようにしています。

4

5 に答える 5

2

わかりました-あなたの人生を複雑に保つために..

  1. strrchr最後を見つけるために使用する\
  2. memcpy(持っていない限り)を使用strncpyして、そのポイントまでの文字数をコピーします。

1.は最後 を返す\ので、パスがのような場合はC:/foo/bar/、で停止し/ます。したがって、境界チェックを行う必要があります...「人生を複雑に保つために」と言いました...

于 2011-08-08T14:06:01.640 に答える
1

文字列に変換し、find_last_ofを実行してから、c_strを呼び出してchar*に戻す方が非常に簡単です。しかし、それはオプションではないので:

編集:ああ、私はstrrcharについて知りませんでした、それは間違いなく理想的でしょう。最後のインデックスから始めて逆方向に作業し、char文字列をループする必要があります。strrcharを使用してパス文字を見つけます(この場合は「/」のように見えますが、これが常にケース)次に、最後のフォルダーの先頭が見つかったインデックスまで、必要なパスの部分を文字列コピー(strcpyまたは関連する関数の1つ)します。

次のような特殊なケースを必ず確認してください

1)返されるパスにはディレクトリが1つだけあります。

2)パスが返されませんでした。

3)その他の場合は_getcwdが返される可能性があります-そのメソッドのドキュメントを確認してください。

于 2011-08-08T14:06:57.880 に答える
0

_getcwdは標準機能ではありませんが、使用法がサポートされているバリアントは見つかりません。代わりに、null引数を使用した使用法の動作は、指定されていないものとして、またはエラーハンドラーの呼び出しとして文書化されています。

一般的な方法でパスを処理するには、Boostファイルシステムライブラリの使用を検討してください。

編集:私は次を見つけました:

POSIX.1-2001標準の拡張として、Linux(libc4、libc5、glibc)getcwd()は、呼び出し時にbufがNULLの場合、malloc()を使用してバッファーを動的に割り当てます。この場合、bufが必要なだけ大きく割り当てられると、サイズがゼロでない限り、割り当てられたバッファーの長さはsizeになります。この方法でバッファを取得した場合は、バッファをfree()することができます(実際、お勧めします)。

Windowsでは動作が逆であることに注意してください。つまり、失敗が保証されています。

乾杯&hth。、

于 2011-08-08T14:11:42.307 に答える
0

ヒント:

int len= strlen(path);
len--;
while(path[len]!='\\')
{
  len--;
}
path[len]='\0';
于 2011-08-08T14:07:19.307 に答える
0

このようなもの?

    char *FullPath = "C:/srcds/orangebox";

    char Buffer[100];

    strcpy(Buffer, FullPath);

    char* Temp = strchr(Buffer, '/');  // find first slash

    if (Temp == NULL)
        ; // handle error

    Temp++;  // skip past slash
    if (Temp == NULL)
        ; // handle error

    Temp = strchr(Temp, '/');  // find second slash

    if (Temp == NULL)
        ; // handle error

    *Temp = 0;  // add string terminator

    puts(Buffer);
于 2011-08-08T14:36:55.860 に答える