プロが教えるわが家の防犯対策術!

ファイル名である文字列からbasenameを(スマートに)取得したいです。
Perlでは何も考えなくてもできたのですが、C(もしくはC++)では次のようなやりかたしか思いつきません。
これでできているので問題ないのですが、何だかモヤモヤします。
また、このやり方では拡張子はピリオド含めて4文字であること前提なのもモヤモヤの原因です。
Perlのようにもっとスマートなやりかたはないでしょうか?

---------------------------------
char filename[] = "test.dat";
char basename[128];

strncpy(basename, filename, strlen(filename)-4);
basename[strlen(filename)-4] = '\0';
---------------------------------

A 回答 (5件)

拡張子がないとか、base自体に.を含むとか、考えると、例えばVCなら_splitpath関数を使うのが一番スマートかも。



C++ならstd::string::find_last_ofで.を探して、
std::string::substrやiterator等の組み合わせで部分文字列を抽出するとか。
    • good
    • 0
この回答へのお礼

_splitpath関数ですか。知らなかったのでちょっと調べてみます。
VC以外はダメなんですかね?
ちょっとそこのところが躊躇されますが、自分はVCなので使ってみます。
スマートそうな匂いがしています。

お礼日時:2006/08/18 22:59

最後のピリオドを探すのであれば、strrchrを使えば一発でできますが、foo.tar.gzのようなファイル名の場合、本当にそれでよいのか、いまいち不安が残りますね。

    • good
    • 0

 


 発展・・・かな?

#include <stdio.h>
#include <string.h>

int main(void)
{
char filename[] = "test0.test1.test2.dat";
char *pch, *temp;

pch = NULL;
for(temp = filename; (temp = strchr(temp, '.')) != NULL; temp ++) pch = temp;
if(pch != NULL) *pch = '\0';
printf("%s", filename);
return 0;
}
 
    • good
    • 0
この回答へのお礼

ありがとうございます。
strchrも検討してみます。

お礼日時:2006/08/18 23:05

 


#include <stdio.h>
#include <string.h>

int main(void)
{
char filename[] = "test.dat";
char *pch;

if((pch = strchr(filename, '.')) != NULL) *pch = '\0';
printf("%s", filename);
return 0;
}
 
    • good
    • 0

1.ファイルネームが格納された文字列を先頭から順に一文字ずつピリオドかどうかをチェックする。



2.ピリオドでない場合はベースネームを格納する文字列にその文字をコピー、ピリオドの場合は'\0'を書き込んで関数を抜ける

っていうのはどうでしょう?
    • good
    • 0
この回答へのお礼

ありがとうございます。
この方法が一番オーソドックスで自然かもしれないです。

お礼日時:2006/08/18 22:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています