数字を検索したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

数字を検索したい

#1

投稿記事 by dic » 15年前

指定した文字列から指定した文字列が最初に現れる関数strstrを
使っているのですが、
下のソースのように文字列に数字が含まれていてて
数字の場合、検索にひっかかるようにしたいのです
#include    <windows.h>
#include    <stdio.h>

void    main()
{
    char    mes[80] = "Hello 1234 world";

    char    *p;
    //    o が先頭のアドレスになる
    p = strstr( mes, "o" );
    printf( "%s\n", p );

    //    数字が先頭のアドレスになる
    p = strstr( mes, "1" );
    printf( "%s\n", p );


    //    実際の状態
    char    mes1[80] = "hello 2345 world";
    char    mes2[80] = "hello 5654 world";
    char    mes3[80] = "hello 3214 world";
    char    mes4[80] = "hello 5874 world";
    char    mes5[80] = "hello 2687 world";
    p = strstr( mes1, "?" );
    printf( "%s\n", p );
    p = strstr( mes2, "?" );
    printf( "%s\n", p );
    p = strstr( mes3, "?" );
    printf( "%s\n", p );
    p = strstr( mes4, "?" );
    printf( "%s\n", p );
    p = strstr( mes5, "?" );
    printf( "%s\n", p );

    /*
    期待する出力結果
        2345 world
        5654 world
        3214 world
        5874 world
        2687 world
    */
}
ソースにコメントアウトしたように
数字がヒットするようにしていする方法はあるのでしょうか?

説明不足だったらすいません

Poco

Re:数字を検索したい

#2

投稿記事 by Poco » 15年前

関数strcspn()を使用してみました。
こんな感じでどうでしょうか?
#適当な関数名が思いつかなかったので、適当につけました。

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

char * hoge( const char * s1, const char * s2 )
{
return (char * ) ( s1 + strcspn( s1, s2 ) );
}

int
main()
{
char mes[/url] = "Hello 1234 world";
char s[/url] = "0123456789";
char * p;
// 実際の状態
char mes1[/url] = "hello 2345 world";
char mes2[/url] = "hello 5654 world";
char mes3[/url] = "hello 3214 world";
char mes4[/url] = "hello 5874 world";
char mes5[/url] = "hello 2687 world";
p = hoge( mes, s );
printf( "%s\n", p );
p = hoge( mes1, s );
printf( "%s\n", p );
p = hoge( mes2, s );
printf( "%s\n", p );
p = hoge( mes3, s );
printf( "%s\n", p );
p = hoge( mes4, s );
printf( "%s\n", p );
p = hoge( mes5, s );
printf( "%s\n", p );

/*
期待する出力結果
2345 world
5654 world
3214 world
5874 world
2687 world
*/
}

たかぎ

Re:数字を検索したい

#3

投稿記事 by たかぎ » 15年前

strcspnかstrpbrkでしょうね。

Poco

Re:数字を検索したい

#4

投稿記事 by Poco » 15年前

> strcspnかstrpbrkでしょうね。

しまった…  orz

dic

Re:数字を検索したい

#5

投稿記事 by dic » 15年前

>strcspnかstrpbrkでしょうね。
はじめてそんな関数があったとは
知りませんでした

そこで、これを応用して文章の中からあるフォーマットの文字列を
取り出したいのですが、アルゴリズムがどうしてもおもいつきません

文章は
[START]
line(120,120)-(240,240)
backimg white
block-img47-1234.jpg
javascript applet.class
block-img32-1234.jpg
[END]
というもので
この中から
block-img47-1234.jpg
block-img32-1234.jpg
を取り出したいのです

今は
char txt[100][256][;
// txt を文章で初期化
int i;
for( i=0; i<50; i++ )
{
 char buf[256];
 sprintf( buf, "block-img%d-1234.jpg", i );
 printf( "%s\n", strstr( txt, buf ) );
}
という方法しか思いつかず、とても速度が遅く
つかいものにならない状態です
テキストも100kbあり1000ファイルもあるので
一日走らせても終わるか終らないかで
高速化できないものかと考えてますが
どうしても考えが浮かびません

このblock-imgxx-1234.jpgを取り出す方法は
他にないでしょうか?

たかぎ

Re:数字を検索したい

#6

投稿記事 by たかぎ » 15年前

> テキストも100kbあり1000ファイルもあるので
> 一日走らせても終わるか終らないかで
> 高速化できないものかと考えてます

必ずこの書式になっていることがわかっているのであれば、行の先頭が "block-img" で始まっているものだけをまずは抽出してください。
そのあと、isdigitで xx の部分をチェック、最後に "-1234.jpg" を比較するとよいでしょう。

現在のアルゴリズムでは、関係のない文字列をわざわざ重いsprintfを使って生成しています。
これでは時間がかかるのは無理ありません。
なお、正確な環境がわかれば、もっと高速化する方法もあります。

dic

Re:数字を検索したい

#7

投稿記事 by dic » 15年前

必ず block-img で始まってますので
教えていただいた方法で試します

それでも遅かったら、さらに高速化を考えます

環境は Windows, VC++6.0 C/C++ です
空き容量も10GB以上あるので、ほぼソースコードの容量の制限もないです

ありがとうございました

dic

Re:数字を検索したい

#8

投稿記事 by dic » 15年前

教えていただいた方法で
十分な速度が確保できましたので
これで良しとします

閉鎖

“C言語何でも質問掲示板” へ戻る