typedef struct{
int num;
char basic_gainen[MAX][32];
int particle[MAX];
}Gainen;
int main (void){
Gainen g1, g2;
char str1[256] = "外国_の_大型_の_船";
char str2[256] = "大型_の_船";
char buf[256];
divide(&g1, str1);//文字列の中から助詞と名詞を取得
divide(&g2,str2);//文字列の中から助詞と名詞を取得
printf("gainen:%s\n",print(&g1,buf));
printf("gainen:%s\n",print(&g2,buf));
if(hikaku(&g1,&g2)==1)
printf("一部の単語は一致する\n");
}
//二つの文字列を比較し、一部一致するかどうかの判定
int hikaku(Gainen *g1, Gainen *g2){
int n,i;
if(g1->num != g2->num){
if(g1->num >= g2->num)
n = g2->num;
else
n = g1->num;
printf("n:%d\n",n);
for(i=n;i>0;i--){
printf("inside loop i:%d\n",i);
if(g1->particle[n] != g2->particle[n])
return 0;
else if(strcmp(g1->basic_gainen[n],g2->basic_gainen[n])
!= 0 )
return 0;
}
}
return 1;
}
divide関数を省略させて頂きます。
hikaku関数のところで、二つの文字列の助詞と名詞が一致しなかったら0を返すその以外は1と返すというふうにしたいですが、実行したらhikaku関数から0の値wが返された。ループの数を表示したら、上のやり方でループがまわらないというのはわかったんです。上の条件判断はいけないですか?ご教授よろしくお願いします。
No.8ベストアンサー
- 回答日時:
divide関数ですが
void divide(Gainen *gainen,char* str){
int i,k,count,particle;
k = 0;
particle = 0;
count = 1;
for(i=0;i<strlen(str);i++){
if(str[i] == '_'){
count++;
}
}
gainen->num = count;
i = 0;
while(str[i]){
i++;
if(str[i] == '_'){
--count;
strncpy(gainen->basic_gainen[count], &str[k], i-k);
gainen->basic_gainen[count][i-k]=0;
k = i + 1;
particle = get_jyoshi(gainen->basic_gainen[count]);
gainen->particle[count] = particle;
}
}
if(count == 1){
strncpy(gainen->basic_gainen[0],&str[k],i-k);
gainen->basic_gainen[0][i-k]=0;
particle = get_jyoshi(gainen->basic_gainen[0]);
gainen->particle[0] = particle;
}
}
こうすれば
g1->particleに 0,1,0,1,0
g1->basic_gainenに "船" "の" "大型" "の" "外国"
が代入されますがこういう仕様のほうがわかりやすいのでは
ありがとうございます。確かにこのやりかたの方が解りやすいですが。自分がやったのはbasic_gainenに助詞に当たる部分、この例では"の"、を除いて、名詞だけ格納するようにしてました。でもphp504が言ったとおり別々にすると先の初期化の問題が出てしまって、処理が難しくなりますね。
どうもありがとうございます。
参考になりますm(_ _)m
No.9
- 回答日時:
#4 で「意味がわからん」と書いたのは, つまるところ「num が数えているものと basic_gainen に入れているものくいちがっているんだけど, どっちが正しいのかがわからん」ってことがあるわけで.
つまり, 現状だと num は「単語の数」を表すように見えるんだけど, basic_gainen に入っているのは「単語」じゃないのでおかしい. 一方, basic_gainen に入っているのは「文節」と考えられるんだけど, そうすると num には「文節」の数を入れなきゃならない. だから, 今のプログラムをそのまま使うなら num の値を修正しないとダメ. あるいは, #8 のように単語ごとに入れるという手もある. どっちにするかは「このあとどのような処理を想定しているか」によります.
もちろん「なぜ basic_gainen に逆順に入っているのか」という疑問は残る. 逆順にする理由は全くわかりません.
No.7
- 回答日時:
char str1[256] = "外国_の_大型_の_船";
char str2[256] = "大型_の_船";
divide(&g1, str1); //文字列の中から助詞と名詞を取得
divide(&g2, str2); //文字列の中から助詞と名詞を取得
ということは、devide()によってstr1, str2が処理され、その結果がg1, g2にセットされたのでしょう。どのような値がg1, g2にセットされたのか、わかっていますか。
"外国…"と"大型…"という、異なるデータを処理したなら、g1とg2に異なる結果が格納されたであろう、と推測できますから、むしろhikaku()が「一致しない」という意味の0を返すほうが自然に思えますけど。
結局、devide()が処理した結果(途中経過)が分からないことには、hikaku()の処理が適切かどうかということも判断のしようがありません。
まずは、devide()の仕様を確認するとか、g1, g2 にどんな内容がセットされたのか表示してみる、といったことが先決ではないでしょうか。
No.6
- 回答日時:
>これでも、まだ返す値が0です。
1が帰ってほしかったのに。=_="とにかく、printfで動作中の各値を確認しましょう。デバッグの基本です。
この回答への補足
そうでしたね。m(_ _)m
printfで動作確認したら、以下のようになります。
これならやっぱり値が0になってますね。^_^;;
gainen:外国_の_大型_の_船
gainen:大型_の_船
n:2
ループ内 i:2
比較するもの :
gainen1[2]:外国,jyoshi1[2]:1 gainen2[2]:55.0.2.ELsmp,jyoshi2[2]:2727536
助詞一致しない
No.5
- 回答日時:
g1->num や g2->numポインタです。
g1 や g2 が持つnumというメンバーを指します。そういうのはここの回答者であれば見ればわかります(g1は構造体のポインタですがnumは整数なのもわかります))
そういうことを聞いているのではなく
g1->numは"外国_の_大型_の_船"の文節の数('_'の数+1)を現します
とか言うことが知りたいのですよ
"外国_の_大型_の_船"の例だと
g1->particle[ ]は0-1しか値が代入されてないし
g1->basic_gainen[ ]は0-2しか値が入らないと思いますよ
残りは初期化してないので不定な値が入っています
g1->numは5なのでg1->particle[4]とかを見ても意味がないです
No.4
- 回答日時:
気になるところ:
・g1, g2 が初期化されていない.
・g1->num や g2->num の意味が分からん.
・(それと関連するけど) divide の仕様が理解不能.
後、追加ですが、g1->num や g2->numポインタです。g1 や g2 が持つnumというメンバーを指します。
ポインタと構造体わかる方お願いします。
No.3
- 回答日時:
>if(g1->particle[i] != g2->particle[i])
この場合のiはnから始まりますよね。
nの値は、
> n = g2->num;
もしくは
> n = g1->num;
ですから、範囲外ではないでしょうか?
ついでに
> for(i=n;i>0;i--){
ですから、添え字が0のの要素も比較されませんね。
for(i=n-1;i>=0;i--){
だと、どうでしょう。
この回答への補足
なんてごちゃごちゃなコード載せてしまった。ー。ー;;すみませんでした。
訂正すると
int hikaku(Gainen *g1, Gainen *g2){
int n,i,count;
count = 0;
if(g1->num != g2->num){
if(g1->num >= g2->num)
n = g2->num;
else
n = g1->num;
for(i=0;i<n;i++){
if(g1->particle[i] != g2->particle[i]){
return 0;
}
else if(strcmp(g1->basic_gainen[i],g2->basic_gainen[i])
!= 0 )
return 0;
}
}
return 1;
}
これでも、まだ返す値が0です。1が帰ってほしかったのに。=_="
No.2
- 回答日時:
forループそのものは問題ないように見えます。
普通は先頭から比較するものですが、趣味の問題ですから。
プログラマが何をしたいかよく分からんですが以下の行の
[n]は[i]ではないのかな。?
if(g1->particle[n] != g2->particle[n])
この回答への補足
すみません、そうでしたね。
if(g1->particle[i] != g2->particle[i])
ありがとうござあいます。
でもまだうまく実行できないです。
何をやりたいか。。伝わってないか~~ 説明が下手ですみません-.-;;
No.1
- 回答日時:
省略したdivide関数が肝心だと思います。
構造体の各メンバーにどういう風にどんな値をセットしているか、
提示のコードではわかりません。
この回答への補足
すみません。divideは以下のようになります。よろしくお願いします
char* divide(Gainen *gainen,char* str){
int i,j,k,pnum,gnum;
int count,particle;
char buf[256],buf2[256];
k = pnum = gnum = 0;
count = 1;
particle = 0;
for(i=0;i<strlen(str);i++){
if(str[i] == '_'){
count++;
}
}
gainen->num = count;
gnum = count/2;
pnum = count/2 - 1;
i = 0;
while(str[i]){
i++;
if(str[i] == '_'){
--count;
strncpy(buf,&str[k],i-k);
buf[i-k] = 0;
particle = get_jyoshi(buf);
if(particle){
gainen->particle[pnum] = particle;
pnum--;
k = i + 1;
}
else{
strncpy(&gainen->basic_gainen[gnum],&str[k],i-k);
gainen->basic_gainen[gnum][i-k]=0;
k = i + 1;
gnum--;
}
}
}
if(count == 1){
while(str[i])
i++;
strncpy(&gainen->basic_gainen[gnum],&str[k],i-k);
gainen->basic_gainen[gnum][i-k]=0;
}
return 1;
}
int get_jyoshi(char* name){
if(strcmp(name,"の")==0) {
return 1;
}
else{
return 0;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) セル内の一部に別セルを差し込む 3 2022/09/18 04:39
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使って魔方陣
-
C言語の二分法のプログラムにつ...
-
構文エラー";"が型の前にあり...
-
初心者です。for文、if文を使っ...
-
for文の中にswitch文はいれられ...
-
C言語 数字以外を入力させない...
-
#if 1 #elseの意味について
-
scanf関数を用いての加減乗除%...
-
c言語の問題
-
配列を関数に渡す方法
-
C言語プログラムが理解できなくて…
-
VHDLで、case文とwhen文のどち...
-
getcの改行判定
-
C言語でfor文を用いたプログラ...
-
c言語プログラミングで1から100...
-
c言語のプログラムで
-
scanfが実行されません
-
直角三角形を表示するプログラム
-
C言語のプログラミング (基礎...
-
for文を使用して値を代入したい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
計算結果がlong型以上になる場...
-
プログラミングで二番目に大き...
-
scanf関数を用いての加減乗除%...
-
getcの改行判定
-
C言語で電卓を作成する。
-
配列を使って魔方陣
-
C言語で勉強中(max,min)の出し方
-
C言語階乗の総和を求める
-
VHDLで、case文とwhen文のどち...
-
C言語でのトランプシャッフルに...
-
プログラム
-
while文について、c言語...
-
OpenCVを用いて任意の時間で静...
-
scanfが実行されません
-
C言語 数字以外を入力させない...
-
C言語です
おすすめ情報