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

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

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

8363閲覧

c言語 リスト構造の検索

isc.2017

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2017/05/13 19:00

編集2017/05/14 06:08

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otaks

2017/05/14 00:03

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

2017/05/14 06:09

ありがとうございます
guest

回答2

0

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

投稿2017/05/13 22:29

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isc.2017

2017/05/14 06:30

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

0

ベストアンサー

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

file

1hoge1@aaa.bbb suzuki.ichirou 1 10 2hoge2@aaa.bbb suzuki.jiro 2 20 3hoge3@aaa.bbb suzuki.saburo 3 30 4hoge4@aaa.bbb suzuki.shiro 4 40 5hoge5@aaa.bbb suzuki.goro,5 50 0 6hoge6@aaa.bbb suzuki.rokuro 6 60 7hoge7@aaa.bbb suzuki.shichiro 7 70

投稿2017/05/14 07:05

編集2017/05/14 07:12
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isc.2017

2017/07/17 05:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問