###前提・実現したいこと
複数の単語を与えてその中で辞書順で一番若い単語を出力するプログラムを作っています。言語はC言語です。単語は一度に与えられて、単語と単語の間は空白か改行で区切られています。
単語の最初の文字の位置を探して大文字を小文字に変えることはできたのですが、単語を最も若い単語と比較する関数がうまく機能しません。
関数の戻り値は比較対象の二つの単語のうち、辞書順で前に来るものの位置文字目が格納されている配列の番号を返すように作りました。しかし、その値をminに代入するといつもminが一単語目の一文字目のASCⅡコードの値になってしまいます。この戻り値を正常に代入できればプログラムは完成です。どこが問題なのか見つけられましたら、教えていただきたいです。
ちなみに、minにはint型で定義した時に0を代入しています。ここに書いたプログラムの前のmain関数内には、
・getchar関数で一文字ずつC-dが打たれるまで文字を格納
・単語数を数えながら、単語の先頭の文字がいる配列の番号をx[i]に格納
・大文字なら小文字に
というプログラムを書きました。
strcmp関数を用いる方法をあとになって知りましたが、ここまで作ったのでこのまま完成させたいです。よろしくお願いいたします。
###発生している問題・エラーメッセージ
このように入力すると、このように出力されます。
cherry tmm C 1回目 youngに入れる前 min=0 return min-k(0) 1回目 youngに入れた後 min=99 2回目 youngに入れる前 min=99 return min-k(99) 2回目 youngに入れた後 min=99 3回目 youngに入れる前 min=99 return min-k(99) 3回目 youngに入れた後 min=99 ------------------------------ Alkkf ke kdjf ksl 1回目 youngに入れる前 min=0 return min-k(0) 1回目 youngに入れた後 min=97 2回目 youngに入れる前 min=97 return min-k(97) 2回目 youngに入れた後 min=97 3回目 youngに入れる前 min=97 return min-k(97) 3回目 youngに入れた後 min=97 4回目 youngに入れる前 min=97 return min-k(97) 4回目 youngに入れた後 min=97
###該当のソースコード
C
1#include<stdio.h> 2#include<string.h> 3 4int young(char *str,int x,int min,int k){ 5 /*x+1番目の文字とmin+1番目の文字を比較 若い方の位置を返す kは最初の文字からどれだけ離れたかの記憶*/ 6 if(str[x]>str[min]){ /*minの方が若い*/ 7 printf("return min-k(%d)\n",min-k); 8 return min-k; /*離れた分戻すためにkを引く*/ 9 } 10 if(str[x]==str[min]){ 11 if(str[min+1]<'A' || (str[min+1]>'Z' && str[min+1]<'a') || str[min+1]>'z'){ 12 /*minの方が単語が短いからreturn min-k*/ 13 printf("return min-k(%d)\n",min-k); 14 return min-k; 15 } 16 else if(str[x+1]<'A' || (str[x+1]>'Z' && str[x+1]<'a') || str[x+1]>'z'){ 17 /*xの方が単語が短いからreturn x-k*/ 18 printf("return x-k(%d)\n",x-k); 19 return x-k; 20 } 21 k++; /*次の文字へ行くから離れた分記憶*/ 22 young(str,x+1,min+1,k); /*次の文字を比較*/ 23 } 24 if(str[x]<str[min]){ /*xの方が若い*/ 25 printf("return x-k(%d)\n",x-k); 26 return x-k; 27 } 28} 29 30/*以上がyoung関数の中身です。*/ 31 32/*以下にyoung関数を用いる前後のプログラムを記します。 33その他の部分に問題がないことは確認済みです。*/ 34 35 for(i=0;i<count;i++){ 36 if(str[x[i]]<'A' || (str[x[i]]>'Z' && str[x[i]]<'a') || str[x[i]]>'z') continue; 37 printf("%d回目 youngに入れる前 min=%d\n",i+1,min); 38 min=young(str,x[i],min,0); /*x[i]+1文字目からの単語とそれまでで一番若い単語の比較*/ 39 printf("%d回目 youngに入れた後 min=%d\n\n",i+1,min); 40 } 41 42
試したこと
文字の読み込みや単語数を数える仕組みに問題がないか、printfを入れて確認しましたが、問題はありませんでした。また、関数の戻り値はおかしくないかを確認するために、return文の前にprintfを書いて正しい値が確認しました。その値は正しいものでした。
また、関数に入れる前からminがおかしくなっていないかprintfで確認しましたが、きちんと初期値の0でした。しかし、関数から代入した後のminには違う値が入ってしまいます。関数の戻り値の型もきちんとint型になっている事も確認しました。
いろいろな単語を入力してみて、minが一単語目の一文字目を小文字にした際のASCⅡコードの値になっていることには気づけました。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー