助けてください。困っています
初めまして
課題でメイン関数(メインメニュー)から呼び出されるサブシステムの「かな氏名検索」を作っているのですが、
自分なりに頑張ってみたものの全くの初心者のため完全に行き詰ってしまい、どこが悪いのかもわからない状態です。
なので、皆さんに教えて頂きたいと思い、
お願いにまいりました。
100人分のデータから「ふりがな」を部分一致で検索して、一致した人のデータを表示させるもので、
探すデータ(社員データ)はカンマ区切りテキストで
社員番号 名前 ふりがな 郵便番号 住所 電話番号 生年月日 入社年月日 役職コード 所属コード 性別
の順に
0523,鈴木一郎,すずきいちろう,105-0000,東京都どこどこ, ,19830101,20090404,01,01,M
のように入っています。空白部には半角スペースが入ってます。
現在の自分で作ったソースは
#include <stdio.h>
#include <string.h>
#include "CFUNC.h"
#include "display.h"
#define NUM 200
typedef struct shain{
char id[5];
char name[21];
char hurigana[31];
char yubin[9];
char jusyo[101];
char tel[14];
int birth;
int nyusya;
char yakusyokucode[3];
char syozokucode[3];
char seibetsu[2];
}shain;
int main(void)
{
int j;
int i;
int cnt = 0;
shain data[100];
FILE *fp;
char *token;
char s[NUM];
char mes[25] = "該当する結果がありません";
char mes2[30] = "該当するメニューがありません";
char str[30];
fp = fopen("shain.txt","r");
if(fp==NULL){
printf("ファイルオープンに失敗しました。\n");
return 1;
}
for(i=0; i<100; ++i){
fgets(s,NUM-1,fp);
token= strtok(s, ","); /* str1の分割(1回目) */
strcpy(data[i].id,token);
token = strtok(NULL, ",");
strcpy(data[i].name,token);
token = strtok(NULL, ",");
strcpy(data[i].hurigana,token);
token = strtok(NULL, ",");
strcpy(data[i].yubin,token);
token = strtok(NULL, ",");
strcpy(data[i].jusyo,token);
token = strtok(NULL, ",");
strcpy(data[i].tel,token);
token = strtok(NULL, ",");
data[i].birth =(int)token;
token = strtok(NULL, ",");
data[i].nyusya=(int)token;
token = strtok(NULL, ",");
strcpy(data[i].yakusyokucode,token);
token = strtok(NULL, ",");
strcpy(data[i].syozokucode,token);
token = strtok(NULL, "\n");
strcpy(data[i].seibetsu,token);
}
cls(); /*検索画面*/
printf("*****************************************************\n");
printf("[かな氏名検索]\n");
printf("かなを入力してください:\n");
printf(" \n");
printf(" \n");
printf(" 0:メニューに戻る\n");
printf("*****************************************************\n");
printf("メッセージ:\n");
for(;;){
setLocate(24,3);
scanf("%s",str);
if(strcmp(str,"0")==0){
break;
}
for(i=0; i<100; ++i){
if(strncmp(str,data[i].hurigana,5)==0){
cnt++;
if(cnt==1){ /*検索結果画面*/
printf("*****************************************************\n");
printf("[かな氏名検索結果]\n");
printf("社員番号 氏名 ふりがな 入社年度 所属 性別 役職\n");
printf(" %s %s %5s %d %s %s %s %s\n", data[i].id,data[i].name,data[i].hurigana,data[i].nyusya, data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode);
}
else{
printf(" %s %s %5s %d %s %s %s %s\n", data[i].id,data[i].name,data[i].hurigana,data[i].nyusya, data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode);
}
}
//見たつからなかった時
if (cnt==0){
setLocate(12,8);
printf("%s\n",mes);
}
//メッセージ
setLocate(24,3);
scanf("%s",str);
setLocate(12,8);
printf("%s\n",mes);
}
}
printf("\n");
fclose(fp);
return 0;
}
所々変なところもあり見にくいと思いますが、
とりあえず単独で検索だけしっかり出来るようにしたいです。
検索は1回だけでなく、何回も出来るようにしたいです。
下手な文章のうえ長文でまことにすいませんが、よろしくお願いします。
お礼
ありがとうございます。大変よく分かりました。 ご教示を受けて、ソースを次のように書き換えてみました。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ #include <string.h> /* strtok() */ int main(void) { □int i, n; □char str[10], *token1, *token2; □printf("入力する文字列の個数を入力して下さい。\n"); □scanf("%d", &n); □printf("入力は、 %d です。\n", n); □printf("文字列を %d 個入力して下さい。\n", n); □printf("(半角10字以内)\n"); □for (i=0; i<n; i++) { □□scanf("%s", str); □□printf("入力は、 %s です。\n", str); □□token1 = strtok(str, ","); □□token2 = strtok(NULL, ","); □□printf("hello = %s , world = %s\n" ,token1 ,token2); □} □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ そして、入力文字列が2つ以上のコンマで区切られていたらどうなるか、疑問に思いましたので、次の入力を行ってみました。 5 ab,cd,ef gh,ij,kl mn,op,qr st,uv,wx yz,ab,cd その実行結果は、次のようになりました。 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 入力する文字列の個数を入力して下さい。 入力は、 5 です。 文字列を 5 個入力して下さい。 (半角10字以内) 入力は、 ab,cd,ef です。 hello = ab , world = cd 入力は、 gh,ij,kl です。 hello = gh , world = ij 入力は、 mn,op,qr です。 hello = mn , world = op 入力は、 st,uv,wx です。 hello = st , world = uv 入力は、 yz,ab,cd です。 hello = yz , world = ab ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ここでのプログラムの働きはどうなっているのでしょうか。2つ目のトークンをtoken2に読み込んだところで、あとの部分は読み捨てられているのでしょうか。