[C言語] Windows95/NT3.1以降対応の、フルパスからディレクトリを取り出す方法を探しています。

C:¥hoge¥hoga¥honge.txt から
C:¥hoge¥hoga¥ を取り出すという感じです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:dev_zer0 No.1

回答回数332ベストアンサー獲得回数25

ポイント30pt

サンプルソースです

#include <stdio.h>

int main(void)

{

  char *path = ”c:¥¥aaa¥¥bbb¥¥ccc.txt”;

  char dir[256];

  char *p;

  *dir = ’¥0’;

  p = strrchr(path, ’¥¥’);

  if(p != NULL)

    /* strncpyは癖があるのでstrncat */

    strncat(dir, path, p - path);

printf(”%s¥n”, dir);

return 0;

}

id:cno No.2

回答回数124ベストアンサー獲得回数12

ポイント20pt

URLはダミーです。

急ぎで書きましたがこのような処理でどうでしょうか?

char *c;//このポインタが文字列の先頭とします

char *cc;//最後の「/」の位置を記憶するフォルダ

while(*c!=’¥0’){

if(*c==’¥¥’){

cc=c;

c++;

}

*cc=’¥0’;//最後の「/」を文字列の終わり’¥0’に置き換える

  • id:Akkiesoft
    コメントのつけ方が…

    なにぶん初質問なもので、コメントのつけ方がいまいちわかりませんでした…(Firefoxだからなのかな?)。

    1番の方へ
    サンプルソースありがとうございます。これを参考に何とかできそうです!

    2番の方へ
    ¥0に置き換えた文字の後ろ(ファイル名の部分)がどうなるのか気になりますが、なんとなくわかったような気がします。

    ありがとうございました〜(o_ _)o
  • id:Akkiesoft
    1番の方へ追伸

    ポイントの件、了解しました。
    回答ポイントはそのままお受け取りください^^
    って、ここに書いてていいのかな…?
  • id:dev_zer0
    Re:1番の方へ追伸

    >ポイントの件、了解しました。
    >回答ポイントはそのままお受け取りください^^
    >って、ここに書いてていいのかな…?
    満足して頂けたなら光栄です。
    ここにも書きますが、上記のサンプルソースはShift-JISに対応できていません。
    下位バイトが¥[0x5C]のコード(例えば表[0x955C])などの場合、
    期待通りの動作をしませんのでご了承願います。
  • id:aki73ix
    Re:1番の方へ追伸

    _splitpath(szPath,szDrive,szDir,szFName,szExt);

    Win3.1では動かないかもしれませんが、こういう関数もあります

    http://hp.vector.co.jp/authors/VA036850/airpark/tips/
  • id:cx20
    _splitpath() のサンプルコード

    一応、貼り付けておきます。

    /* splitpath.c */
    #include <stdlib.h>
    #include <stdio.h>

    int main( int argc, char* argv[] )
    {
      char path_buffer[_MAX_PATH];
      char drive[_MAX_DRIVE];
      char dir[_MAX_DIR];
      char fname[_MAX_FNAME];
      char ext[_MAX_EXT];
      _makepath( path_buffer, ”c”, ”¥¥hoge¥¥hoga¥¥”, ”honge”, ”txt” );
      printf( ”_makepath 関数で作成されたパス名: %s¥n¥n”, path_buffer );
      _splitpath( path_buffer, drive, dir, fname, ext );
      printf( ”_splitpath 関数によるパス名の分解:¥n” );
      printf( ” ドライブ : %s¥n”, drive );
      printf( ” ディレクトリ: %s¥n”, dir );
      printf( ” ファイル名 : %s¥n”, fname );
      printf( ” 拡張子 : %s¥n”, ext );
      
      return 0;
    }

  • id:Akkiesoft
    Re(2):1番の方へ追伸

    >_splitpath(szPath,szDrive,szDir,szFName,szExt);
    _splitpathは既に使っていましたが、Windows98からの関数で、Windows95では使えないのではてなで質問していました…^^;
  • id:shampoohat
    2番の回答

    ¥がない入力が来たら暴走だよね♪
  • id:virus
    Re(3):1番の方へ追伸

    >_splitpathは既に使っていましたが、Windows98からの関数で、Windows95では使えないのではてなで質問していました…^^;

    _splitpath() はCのランタイムライブラリで Windows とは直接関係はありません。
    Windows95 で使えないと言う意味がわかりませんが、たまたまWindows95 時代にお使いだったコンパイラに実装されてなかったか、Windows95 にないAPIを使ってるのか・・・いずれにしてもコンパイラに依存する話ですね(^^ゞ
  • id:Akkiesoft
    解決しました〜

    いまさらですが、_splitpathが原因ではありませんでした(^^;;;
    サンプルコードを書いてくださったcx20さん、アドバイスをしていただいたvirusさん、ありがとうございました^^

    完成したソフトのURLを書いておこうかな?
    http://koya.marokun.net/soft/index.html#laf

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません