掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28138

sscanfの使い方
投稿者---こう(2006/09/13 21:05:47)


sscanfを使って、ファイル名と拡張子を切り分けようとしています。
しかし、拡張子だけが上手く取り出せません。


#include <stdio.h>

#define FILENM "/home/DATA/apply_list.csv"

main()
{
    char name[64],kaku[10];
    int n;

    n=sscanf(FILENM,"%[^.]s.%255s",name,kaku);

    printf("[%d][%s][%s]\n",n,name,kaku);
}


sscanf(FILENM,"%s.%s",name,kaku);
sscanf(FILENM,"%[^.]s.%255s",name,kaku);
sscanf(FILENM,"%[^.]s.%s",name,kaku);
sscanf(FILENM,"%[^.]*s.%255s",name,kaku);

いろいろと、やってみたのですが、どれも上手く行きません。
どうすれば上手くいきますか。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sscanfの使い方 28140 Blue 2006/09/13 21:32:17
<子記事> Re:sscanfの使い方 28141 yoh2 2006/09/13 22:05:04


No.28140

Re:sscanfの使い方
投稿者---Blue(2006/09/13 21:32:17)


"%[^.].%s"では?

ただ、abc.efg.h の場合、 efg.h が拡張子かといわれるとどうなんでしょうか?


この投稿にコメントする

削除パスワード

No.28142

Re:sscanfの使い方
投稿者---こう(2006/09/13 22:06:30)


>"%[^.].%s"では?
>
>ただ、abc.efg.h の場合、 efg.h が拡張子かといわれるとどうなんでしょうか?

ありがとうございます。

>efg.h が拡張子かといわれると
sscanfは使わずに、strrchrとかの標準関数で見た方がよいのかも。



この投稿にコメントする

削除パスワード

No.28141

Re:sscanfの使い方
投稿者---yoh2(2006/09/13 22:05:04)


%[...]や%[^...]の使い方を間違えています。これらの変換には's'はつきません。

ファイル名に
1. ファイル名には'.'は高々ひとつ。
2. ディレクトリ名には'.'が入らない。
3. 拡張子には空白文字が入らない

という条件を仮定してよいなら、
sscanf(FILENM, "%[^.].%s", name, kaku);

で済みます。
> sscanf(FILENM,"%[^.]s.%s",name,kaku);

これは惜しかったですね。

条件3を満たせないなら、kakuをゼロクリアした上で、
sscanf(FILENM,"%[^.]s.9c",name,kaku);/* 9はsizeof(kaku)-1 */

でいかがでしょう?

さて、条件1を満たさない場合(例: "01.トラック1.flac")や
条件2を満たさない場合(例: "/etc/conf.d/nfs")は、残念ながら
原理上 sscanf() 一発で拡張子とその他を分離することはできません。
これらの場合も考えなくてはならないなら、sscanf()一発で変換というのをあきらめて、
strrchr()など、他の文字列操作関数を組み合わせて地道に判断していくしかありません。
# または正規表現ライブラリを使うとか。


あ、さらに暗黙に仮定していた条件として、

0. マルチバイト文字の一部に'.'が含まれない

というのもありますね。
この条件を満たせないなら、全部自作するか、ロケールがそのマルチバイト文字列に
対応していることを期待してワイド文字列関連の関数を使うことになるでしょう。


この投稿にコメントする

削除パスワード

No.28143

Re:sscanfの使い方
投稿者---yoh2(2006/09/13 22:09:04)


ああ、人に指摘しておきながら間違えた。
× sscanf(FILENM,"%[^.]s.9c",name,kaku);/* 9はsizeof(kaku)-1 */
○ sscanf(FILENM,"%[^.].9c",name,kaku);/* 9はsizeof(kaku)-1 */

しかも回答かぶったorz


この投稿にコメントする

削除パスワード

No.28144

Re:sscanfの使い方
投稿者---こう(2006/09/13 22:17:05)


ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧