- ベストアンサー
80文字以下の文字列をピリオドで埋めるプログラムの違い
- ユーザーが入力した文字列が80文字以下の場合、ピリオドを追加して表示するプログラムがあります。しかし、二つのプログラムのうち上のプログラムは正常に機能しますが、下のプログラムはうまく機能しません。それぞれのプログラムの違いについて説明します。
- 上のプログラムでは、文字列の長さが80文字未満の場合にforループが実行され、文字列の末尾にピリオドを追加しています。しかし、下のプログラムではforループの初期値が異なり、文字列の末尾にピリオドを追加する代わりに、末尾から2番目の要素にピリオドを代入しています。
- この違いがプログラムの動作に影響しているようです。上のプログラムでは文字列の末尾にピリオドが正しく追加され、出力結果は期待通りになります。しかし、下のプログラムではピリオドが正しく代入されず、出力結果が期待通りになりません。これが二つのプログラムの違いの原因です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
str[]はchar型なので、 for(i=strlen(str)+1;i<79;i++) str[i] = '.'; です。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8745/19849)
>上はうまくいきますが、下はうまくいきません。 どちらも「失敗」しています。上は「失敗しているのが、表面化してないだけ」です。 どちらも char str[80]; である為、strに入れられる文字列の最長は「79文字」です。 C言語の文字列には「文字列の終端記号」と言うのが付加されますから、charが80個の配列に入れられる最長の文字列は「80-1=79」で「79文字」です。 上も下も char str[81]; と書かないと、80文字の文字列を入れる事はできません。 もし「無理に入れる」と「メモリの何処かを書き替えて、何かを壊す」事になります。 予期しないメモリに書き込んだとしても「運良く、壊れても影響が出ない場所」だったり「メモリに書き込んでは居るが、運良く、書き込む前と同じ値を書き込んで、メモリが変化しなかった」だったりすると、今回の「上の方」のように「問題が表面化しないで終る」ので、バグに気付く事が出来ません。 >str[i] = "."; 他の回答の通り「charに、文字列へのポインタを代入している」ので「それ以前の問題」です。 ここは str[i] = '.'; にしなければなりません。 また、最後に str[80] = '\0'; として「文字列の終端記号」を書き込まないと、おかしな事になります。
お礼
解答ありがとうございます。
- php504
- ベストアンサー率42% (926/2160)
最後に0を for(i=strlen(str)+1;i<79;i++) str[i] = '.'; } str[i] = '\0';
お礼
解答ありがとうございます。
- redfox63
- ベストアンサー率71% (1325/1856)
strが80個しか確保していないので if ( strlen( str ) < 80 ) で判断して strcatで連結すると文字列の終端をあらわす NULLが予定外の部分を壊してしまう可能性があります char str[81]; といった具合に確保して80文字分の領域とNULL文字格納分をとりましょう
お礼
解答ありがとうございます。
お礼
解答ありがとうございます。 int main() { char str[81]; int i; printf("文字列を入力してください。\n"); gets(str); if(strlen(str)<80) { for(i=strlen(str)+1;i<79;i++) str[i] = '.'; } printf("%s",str); } でもうまくいきませんでした。.がでてきません。