アドレス帳の検索機能だけのプログラムを作っています。
作りたいプログラムは、
1,検索したい人の名前を入力する
2,事前に登録された情報の中から部分一致検索する
3,部分一致検索で該当した人のメールアドレス、氏名、グループの番号、IDを該当した人数分表示する
というものです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 128
#define DATASIZE 1000
struct data {
char mail[256]; //メールアドレス
char name[256]; //氏名
int number; //グループの番号
int ID; //登録された人のID
struct data *next;
};
int search(struct data *data){
char buf[BUFSIZE], imput[BUFSIZE]; //検索する名前を格納
struct data *p = data->top;
printf("名前で部分一致検索します。\n名前を入力してください:\n");
fgets(imput, sizeof buf, stdin);
while(p != NULL){
この後なんですが、fgetsでchar型のbufに入れた文字列と、構造体の中のchar型のnameに入っている文字列が部分的に一致しているかを調べるにはどうすればよいでしょうか?
if(strcmp()
でやろうと思ったのですが、それでは部分的に一致しているかがわからないので・・・
-
クリップを取り消します
-
質問の評価を上げたことを取り消します
-
質問の評価を下げたことを取り消します
checkベストアンサー
+1
struct data *next;とあるので次の構造体のアドレスを指して様になっているとしました。また最後のnextにはNULLが入ると想定しています。
ファイルよりリストを作成してみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 128
#define DATASIZE 1000
struct data {
char mail[256]; //メールアドレス
char name[256]; //氏名
int number; //グループの番号
int ID; //登録された人のID
struct data *next;
};
struct data ad[DATASIZE];
int search_main(struct data *ap, int cnt){
char buf[BUFSIZE]; //検索する名前を格納
int j = 0;
int count = 0; //検索で該当した人数
struct data *t = ap;
char b[256], *p, *r; //部分一致検索で使用
printf("名前で検索します\n名前を入力してください:");
int ln;
fgets(buf, sizeof buf, stdin);
ln = strlen(buf);
buf[ln-1]='\0';
p = buf;
while(1){
printf("%sを部分一致検索します\n", buf);
if ((r = strstr(t->name, p)) != NULL){
printf("メールアドレス:%s\n氏名:%s\nnumber:%d\nID:%d\n",t->mail, t->name, t->number, t->ID);
count++;
}
if (t->next == NULL) break;
t = t->next;
}
printf("%d件見つかりました。\n", count);
return cnt;
}
void main(void){
FILE *fp; /*ファイルポインタ*/
char line[256];
struct data *p;
struct data *q;
struct data *root;
root = (struct data *)calloc(sizeof(struct data), sizeof(char));
int cnt=1;
p = root;
fp = fopen("test.txt","r");
while((fscanf(fp,"%s%s%d%d",p->mail,p->name,&p->number,&p->ID)) !=EOF){
cnt++;
p->next = (struct data *)calloc(sizeof(struct data), sizeof(char));
q = p;
p = p->next;
}
free(p);
cnt--;
q->next = NULL;
p = root;
while (p->next != NULL){
printf("%s %s %d %d \n",p->mail,p->name,p->number,p->ID);
p=p->next;
}
printf("%s %s %d %d \n",p->mail,p->name,p->number,p->ID);
fclose(fp);
search_main(root, cnt);
}
ファイルtest.txt
hoge1@aaa.bbb suzuki.ichirou 1 10
hoge2@aaa.bbb suzuki.jiro 2 20
hoge3@aaa.bbb suzuki.saburo 3 30
hoge4@aaa.bbb suzuki.shiro 4 40
hoge5@aaa.bbb suzuki.goro,5 50 0
hoge6@aaa.bbb suzuki.rokuro 6 60
hoge7@aaa.bbb suzuki.shichiro 7 70
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼