ページ 11

検索処理について

Posted: 2011年2月15日(火) 11:30
by DOR
二分探索を使わずにファイルnamelist.txt の入出力により
名前から電話番号を検索するプログラムを作成したいのですが、
どなたかアドバイスや解法を教えて頂けないでしょうか。

コード:


#include<stdio.h>
#define LINE_BUF 1024

int main(void){

	char name;
	char buf[LINE_BUF];
	FILE *fp=fopen("debug.txt","r");

	printf("検索したい名前を入力:");
	scanf("%s",&name);
	if(fscanf(fp,"%s",&buf)==name){
		printf("電話番号:");
		printf("%s",buf);
	}else{
                printf("リストにはありませんでした");
        }

	fclose(fp);
	return 0;
}

//namelist.txt

sigetora_kihi 011-375-7944
sigemasa_kotanzi 011-782-8302
shuukou_sirosuga 011-358-8598
sahiro_oziro 019-834-5027
koito_motoe 011-546-2606
shuuiti_yatutaba 08-8168-8408
 

Re: 検索処理について

Posted: 2011年2月15日(火) 11:43
by non
fscanfは読み込んだデータの個数を返します。

それは、ともかく、完全一致なのか部分一致なのか、データーはソートされているのかなど、他に条件はないの?

Re: 検索処理について

Posted: 2011年2月15日(火) 11:52
by bitter_fox
DOR さんが書きました:二分探索を使わずにファイルnamelist.txt の入出力により
名前から電話番号を検索するプログラムを作成したいのですが、
どなたかアドバイスや解法を教えて頂けないでしょうか。

コード:

    char name;

	printf("検索したい名前を入力:");
	scanf("%s",&name);
	if(fscanf(fp,"%s",&buf)==name){
nameはchar型なのに
scanf("%s", &name);
とするのは正しくありません。

コード:

#define MAX_LEN_NAME 256

char name[MAX_LEN_NAME];

scanf("%s", name);
と言った風にするべきでしょう。(もっとセキュアにするならscanf("%*s", MAX_LEN_NAME-1, name)とします)

また、fscanfの戻り値はEOF(ファイルの終点の時)か入力に成功した項目数なのでnameと同じになる可能性は非常に低いですし、その比較では意図した結果にならないでしょう。
文字列の比較にはstrcmpを使用します。

それから、ファイルの読み込みはfscanfがEOFを返す(ファイルの終端に来る)までループで回すのが適切でしょう。

コード:

while (fscanf(fp, "%s%s", buf, telNumber) != EOF) // buf及びtelNumberは文字列(bufには名前、telNumberには電話番号が入る)
{
}
http://www9.plala.or.jp/sgwr-t/c/sec05.html - scanf
http://www9.plala.or.jp/sgwr-t/lib/strcmp.html - strcmp
http://www.kiso.tsukuba.ac.jp/~makimura ... de128.html - fscanf

Re: 検索処理について

Posted: 2011年2月15日(火) 12:33
by DOR
non さんが書きました:fscanfは読み込んだデータの個数を返します。

それは、ともかく、完全一致なのか部分一致なのか、データーはソートされているのかなど、他に条件はないの?
条件は特に指定されていないのですが、自分としては名前が部分一致して
電話番号を出力するような形にしたいと考えています。

Re: 検索処理について

Posted: 2011年2月15日(火) 12:36
by bitter_fox
DOR さんが書きました: 条件は特に指定されていないのですが、自分としては名前が部分一致して
電話番号を出力するような形にしたいと考えています。
部分一致するにはstrstr関数を用いて次のようにします。

コード:

if (strstr(str1, str2) != NULL)
{
}
http://www9.plala.or.jp/sgwr-t/lib/strstr.html

Re: 検索処理について

Posted: 2011年2月15日(火) 15:19
by DOR
様々なアドバイスありがとうございます。
おかげさまでなんとかなりました!