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

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

ただいまの
回答率

89.72%

c言語 リスト構造の検索

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,421

isc.2017

score 10

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

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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

  • otaks

    2017/05/14 09:03

    投稿時、ソースは<code>ボタンを押下後、```ここに言語を入力 コード ``` 「ここに言語を入力」部分をCとすると見やすいです

    キャンセル

  • isc.2017

    2017/05/14 15:09

    ありがとうございます

    キャンセル

回答 2

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/17 14:24

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

    キャンセル

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

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