C言語関係掲示板

過去ログ

No800 Cソースの判定

[戻る] [ホームページ]
No.10006

Cソースの判定
投稿者---Cっぽこ(2003/10/25 14:58:19)


readdirでディレクトリ内のファイル名を取得してそのファイルがCソースだったら表示としたいのですがいい方法はないでしょうか?
UNIXのgccを使っています。

while ((ent = readdir(dir)) != NULL) {
       if(Cソース(.c)だったら){
                printf("%s\n",ent->d_name);
                count++;
       }
}


No.10013

Re:Cソースの判定
投稿者---YuO(2003/10/25 16:33:00)


>readdirでディレクトリ内のファイル名を取得してそのファイルがCソースだったら表示としたいのですがいい方法はないでしょうか?

「Cソース」の定義は何ですか?

単にサフィックスが.cである,というだけならば,
strlen(ent->d_name) >= 2 && strcmp(ent->d_name + strlen(ent->d_name) - 2, ".c") == 0

を満たすか否かで判定できますが。

No.10020

Re:Cソースの判定
投稿者---Cっぽこ(2003/10/25 17:07:13)


strcmp(ent->d_name + strlen(ent-d_name) - 2, ".c") == 0

勉強不足で申し訳ないんですがこの意味がわからないのですが教えてもらえないでしょうか?
文字と数字をたしているというのはどういうことでしょう?



No.10023

Re:Cソースの判定
投稿者---YuO(2003/10/25 18:00:29)


>strcmp(ent->d_name + strlen(ent-d_name) - 2, ".c") == 0
>勉強不足で申し訳ないんですがこの意味がわからないのですが教えてもらえないでしょうか?
>文字と数字をたしているというのはどういうことでしょう?

文字と文字列は区別して下さい。


ent->d_name + strlen(ent->d_name) - 2
は,「文字列へのポインタ」に対して演算しています。

ent->d_nameは配列型ですが,標準変換によってすぐに最初の要素へのポインタになります。
そして,strlen(ent->d_name)を足すことによって,
ent->d_nameが指す文字列の末尾のナル文字を指すポインタを得て,
2を引くことによって後ろから2文字目を指すポインタを取得しています。

ちなみに,strlen(ent->d_name) >= 2を先に書いたのは,
ent->d_nameの指す文字列の長さが2未満だと,
配列の先頭要素より前をアクセスしようとすることになって,
未定義動作の領域に踏み込むことになるためです。
#ent->d_name - 2 + strlen(ent->d_name)も先に2が引かれるので未定義動作。


このような場合,私はポインタ演算を好みますが,ポインタだとわからないのであれば,
strcmp(&ent->d_name[strlen(ent->d_name) - 2], ".c") == 0
でも同じことです。ついでに,
char * p = ent->d_name;
としておいて,
strcmp(&p[strlen(p) - 2], ".c") == 0
も同じことになります。


まぁ,やっていることはent->d_nameの最後二文字が.cであるか否かを調べているのですが。


No.10025

Re:Cソースの判定
投稿者---Cっぽこ(2003/10/25 18:06:56)


YuOさん詳しく教えていただいてありがとうございました

No.10026

Re:Re:Cソースの判定
投稿者---ceybord(2003/10/25 19:59:46)


>まぁ,やっていることはent->d_nameの最後二文字が.cであるか否かを調べているのですが。

文字列変数とchar型ポインタ変数が同じものだとわかっていても、
いざ人の書いたプログラムを読むとよくわからなくなるのです。
ちなみに、#include<string.h>なしでstrlen関数とstrcmp関数を使えるコンパイラがあるのですか?

No.10029

Re:Re:Cソースの判定
投稿者---YuO(2003/10/25 21:13:12)


>ちなみに、#include<string.h>なしでstrlen関数とstrcmp関数を使えるコンパイラがあるのですか?

C95及びそれ以前の処理系であれば,恐らく。
とりあえず全て32bit Windows用の処理系ですが,
・Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.00.9466 for 80x86
cl /Wall /Za test_vc.c
→警告 C4013
・Borland C++ 5.5.1 for Win32
bcc32 -A -w test_bcc.c
→警告 W8065
・Digital Mars Compiler Version 8.35n
sc -A -w test_sc.c
→警告無し
・Open Watcom C/C++32 Compile and Link Utility Version 1.1
wcl386 -we -za test_wcc.c
→警告無し
で全てコンパイル・リンクでき,実行も可能でした。
#strlen関数で確認。