質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.13%

c言語 リスト構造の検索

解決済

回答 2

投稿 編集

  • 評価 0
  • クリップ 0
  • VIEW 4,149

score 12

アドレス帳の検索機能だけのプログラムを作っています。

作りたいプログラムは、 
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()
でやろうと思ったのですが、それでは部分的に一致しているかがわからないので・・・

  • クリップを取り消します

  • 質問の評価を上げたことを取り消します

  • 質問の評価を下げたことを取り消します

質問への追記・修正、ベストアンサー選択の依頼

回答 2

+4

strstr()を使って部分文字列検索をするといいと思います。一致があれば開始位置のポインタ、一致がなければNULLを返すので、そこで条件分岐できます。

投稿

raccy

score 20886

  • isc.2017

    isc.2017

    2017/05/14 15:30

    ありがとうございます!
    やってみます

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

投稿

編集

A.Ichi

score 3939

  • isc.2017

    isc.2017

    2017/07/17 14:24

    返信がかなり遅れてしましました。丁寧に教えていただいたのに、申し訳ありません。
    こちらの回答を参考に自分なりに改変していって、完成しました!本当にありがとうございました。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る