
ファイル名である文字列からbasenameを(スマートに)取得したいです。
Perlでは何も考えなくてもできたのですが、C(もしくはC++)では次のようなやりかたしか思いつきません。
これでできているので問題ないのですが、何だかモヤモヤします。
また、このやり方では拡張子はピリオド含めて4文字であること前提なのもモヤモヤの原因です。
Perlのようにもっとスマートなやりかたはないでしょうか?
---------------------------------
char filename[] = "test.dat";
char basename[128];
strncpy(basename, filename, strlen(filename)-4);
basename[strlen(filename)-4] = '\0';
---------------------------------
No.3ベストアンサー
- 回答日時:
拡張子がないとか、base自体に.を含むとか、考えると、例えばVCなら_splitpath関数を使うのが一番スマートかも。
C++ならstd::string::find_last_ofで.を探して、
std::string::substrやiterator等の組み合わせで部分文字列を抽出するとか。
_splitpath関数ですか。知らなかったのでちょっと調べてみます。
VC以外はダメなんですかね?
ちょっとそこのところが躊躇されますが、自分はVCなので使ってみます。
スマートそうな匂いがしています。
No.5
- 回答日時:
最後のピリオドを探すのであれば、strrchrを使えば一発でできますが、foo.tar.gzのようなファイル名の場合、本当にそれでよいのか、いまいち不安が残りますね。
No.4
- 回答日時:
発展・・・かな?
#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;
}
No.2
- 回答日時:
#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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 バイナリファイルをfloa...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
テキストデータをそのままバイ...
-
c言語の問題の説明、各所ごとに
-
char型からのバイト数取得
-
strncpyと_tcsncpy_sのヌルの扱...
-
中置記法の問題なのですが…
-
pingの結果を取得する方法
-
CStringをwchar_tに変換したい
-
str系関数を使わずに二つの文字...
-
文字を16進変換
-
main の引数には const 付けた方が
-
'const char *' 型は 'char *' ...
-
switch文で文字を比較すること...
-
配列をnビットシフトする
-
ASCII変換について
-
fgetsについて
-
C言語のfor文です。 繰り返しの...
-
バイナリファイルをコピーする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
C言語の入力した文字を反転させ...
-
構造体のアライメント調整
-
strncpyと_tcsncpy_sのヌルの扱...
-
TCP/IP通信型大文字・小文字変...
-
char型からのバイト数取得
おすすめ情報