今だけ人気マンガ100円レンタル特集♪

CUI環境でのワイルドカードのプログラムを考えています。
関数の再帰呼出しを使うと思うのですが、どのようなプログラムになるのでしょうか?もしくは、再帰呼び出しを使わずにワイルドカードを判別するプログラムが作れるのであれば、それはどのようになるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

参考


http://www.google.co.jp/search?hl=ja&lr=lang_ja& …

MS-DOSのように狭義的な「*」と「?」のみならただのループで処理できる。
しかしCUIではシェルがワイルドカードを分解してから渡してしまうのでその辺りを考慮しなければならない
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考のURLをよく調べてみます。

お礼日時:2007/07/16 20:54

他の方もおっしゃっるように、「ワイルドカード」といっても何のことかサッパリ分かりません。


CUIでできる↓のことかもしれませんし。
http://www.square-enix.com/jp/archive/wildcard/

第三者に理解できる文章表現を練習することは、意外にプログラミングの上達にもつながりますよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
うまく文章表現できずに申し訳ありません。
そして私の質問は回答で記述されているURLのワイルドカードではありません。
色々と調べてみたところ、解決いたしました。
ANo1~4さん、どうもありがとうございました。

お礼日時:2007/07/16 20:58

CUI環境といっても, OS やシェルに依存して動作がかわるので, これだけだと「何をしたいのか」がわからないなぁ. どんなものを

お使い?

この回答への補足

説明足らずで失礼いたしました。
OSはWindowsXPです。シェルについて、あまりPCに詳しくないので何の事か私には分かりません(すみません)。開発ツールはVisual C++2005を使っていますが、この事と関係ありますか?

補足日時:2007/07/16 20:54
    • good
    • 0

「ワイルドカードのプログラム」ってなんですか?

この回答への補足

説明足らずで失礼いたしました。
「?」…任意の一文字
「*」…任意の長さの任意の文字
このワイルドカードを使って文字を調べられるプログラムです。
例えば複数の人名が書かれている文字列から、2文字目に「中」という文字を含む名前を見つけ出す場合、「?中*」と入力すれば見つけられるというプログラムです。

補足日時:2007/07/16 20:53
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qワイルドカードを用いた文字列検索

皆様こんにちは、
Windows2000+VC6にてワイルドカード(*,?)での文字列比較を
作成したいのですが、そういう関数は無いのですね。
比較対象文字列には2バイト文字も含まれており、*,?自身も
比較できないといけません。
なにか良い方法や、サンプルを教えて頂ければありがたいです。

VBではLIKEで一発だったと思うのに.....
VBからCに入ると戸惑うことがいっぱいですね。

よろしくお願い致します。

Aベストアンサー

再帰関数でこうゆう感じのが有りです→(参考URL)

const char *Ptn …ワイルドカード付き文字列
const char *Str …検索対象
戻り値 …1/0:真/偽
int StrMatch( const char *Ptn, const char *Str )
{
switch( *Ptn )
{
case '\0':
return (*Str=='\0');
case '*':
return StrMatch( Ptn+1, Str ) || (*Str!='\0') && StrMatch( Ptn, Str+1 );
case '?':
return (*Str!='\0') && StrMatch( Ptn+1, Str+1 );
default:
return ((unsigned char)*Ptn==(unsigned char)*Str) && StrMatch( Ptn+1, Str+1 );
}
}//StrMatch

例:
char ptn[] = "?bc*g*";
char str[] = "abcdefgh"
int ret;
ret = StrMatch( ptn, str );
printf("ret=%d\n", ret); //←ret=1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


これをマルチバイト(SJIS)対応にする場合、
・文字列ポインタのインクリメント
 Ptr+1、Str+1 → _mbsinc(Ptn)、_mbsinc(Str)
・比較のための1文字取得
 *Ptr、*Str → _mbsnextc(Ptr)、_mbsnextc(Str)
を修正し、

int StrMatchMBS( const unsigned char *Ptn, const unsigned char *Str )
{
switch( *Ptn )
{
case '\0':
return (_mbsnextc(Str)=='\0');
case '*':
return StrMatchMBS( _mbsinc(Ptn), Str ) || (_mbsnextc(Str)!='\0') && StrMatchMBS( Ptn, _mbsinc(Str) );
case '?':
return (_mbsnextc(Str)!='\0') && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );
default:
return (_mbsnextc(Ptn)==_mbsnextc(Str)) && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );
}
}

例:
char ptn[] = "*o"; // コード…"*" + 0x6f
char str[] = "P"; // コード…0x826f
int ret, retMBS;
ret = StrMatch( ptn, str );
retMBS = StrMatchMBS( ptn, str );
printf("ret=%d retMBS=%d\n", ret, retMBS);
//↑ret=1 retMBS=0
// StrMatch の方では、バイト単位比較なので全角1文字「P」と
// 半角「*o」が同じとされてしまう。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

てなところです。既述されているようにC言語に標準
関数では存在しません。
ここの物はシンプルに完成されている関数だと思いますが、
確実かどうかは知りません。ですが、ざっと見たところでは、
LIKE比較で前方後方真中複数ワイルドカード・? 検索、
共に問題は無さそうです。

なんかの役に立てばどうぞ

参考URL:http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm

再帰関数でこうゆう感じのが有りです→(参考URL)

const char *Ptn …ワイルドカード付き文字列
const char *Str …検索対象
戻り値 …1/0:真/偽
int StrMatch( const char *Ptn, const char *Str )
{
switch( *Ptn )
{
case '\0':
return (*Str=='\0');
case '*':
return StrMatch( Ptn+1, Str ) || (*Str!='\0') && StrMatch( Ptn, Str+1 );
case '?':
return (*Str!='\0') && StrMatch( Ptn+1, Str+1 );
default:
return ((unsigned char)*Ptn==(unsigned char)*Str) && StrMatch( Ptn+...続きを読む

QC言語、ファイルの存在チェック(ワイルドカードで)

if( access( "*.txt", 0) != -1 ) //ワイルドカードで存在CHK
{
 //存在しない時
}

このようにやりたいのですが、
実験すると、*は使えないようです
何かやりかたないでしょうか?

access じゃなくてもかまいません

※vc++環境です


よろしくお願いします

Aベストアンサー

これ?

参考URL:http://msdn.microsoft.com/ja-jp/library/cc429233.aspx

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

Qファイルの中身検索と表示

Cでの作成についてなんですが、
fopenでテキストファイルを開き、テキストの中身の
特定文字が含まれている行を新に作ったファイルの中に
書き込みたいんですが、テキストの中身の検索と
抽出方法がいろいろ試してみましたがわかりません。
よろしくお願いします。

Aベストアンサー

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定の文字列を含まれた行を抽出するサンプルを下に載せます。

サンプル:
char buff[ 256 ];
char *find = "検索文字列";
FILE *fp; ←読み込み用
FILE *fo; ←抽出用

省略(fopen×2つ)

while ( fgets(buff,sizeof(buff),fp) != NULL ){
 if ( strstr(buff,find) != NULL ){
  fputs( buff, fo );
 }
}

省略(fclose×2つ)

解説:
・上記のサンプルでは、行単位でテキストの中身を取得して、この文字列から検索文字列(find)が
 含まれるか『strstr()』関数でチェックしています。見つかると『NULL』以外を返します。
・そして、見つかったらば行単位で『fputs』関数で出力しています。
 これで見つかった行だけが、新たに作ったファイルに書き込まれていきます。→抽出です。
・また『strstr()』関数の部分を
 『if ( strchr(buff,'a') != NULL ){ … }』とすると『a』の文字が含まれる行のみを抽出します。
 『if ( strspn(buff,"+-*/") != 0 ){ … }』とすると『+-*/』の文字群が含まれる行のみを抽出します。
 検索する文字とは、1文字、文字群、文字列のどれですか?
・以上。おわり。→上記のを参考にして下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strspn.html,http://www9.plala.or.jp/sgwr-t/c/sec17.html

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定...続きを読む

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Qstring型からint型への型変換

C++で、string型からint型は、

string str; //ほかのstring型の変数から整数部分のみを切り出して来たものが入る
int i; //ここにstrの中身(整数)をあらたに入れたい
が定義されている下で、

char s[10]="0";
などを通して、

int length=str.length();
str.copy(s,length,0);
i=atoi(s);

とやる他ないのでしょうか?
初心者のつまらない質問ですが、ご教授いただけると幸です。
よろしくお願いします。

Aベストアンサー

#include <string.h>
#include <strstream.h>

int main(void){
string str("1234");
istrstream istr(str.data());
int i;

istr >>i;
cout << i << '\n';
return(0);
}
strstreamを使うことで、
cin >> i;
と同じように変数に代入できます。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC言語で文字列をかえす正しい書き方が知りたいです?

C言語で次の警告が表示されます。
文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか?


jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。


char *test(char *a, int b)
{
char str[BUFSIZ];
return str; <------

}

Aベストアンサー

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び出し元でちゃんとfreeしましょう。

B-2.呼び出し元でメモリを確保するケース
(注意:同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{

...

return str;
}
これは#1の方の回答と同じです。

B-3.B-1/B-2の複合
(注意:NULL以外の同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{
if(str == NULL)
{
str = malloc(BUFSIZ);
if(str == NULL) return NULL; //エラー
}

...

return str;
}

こんなところですかね。

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング