- ベストアンサー
プログラミングの問題で悩んでいます
- プログラミングの問題で文字列のアスキーコードを上げて表示するプログラムがうまく動きません。
- また、文字列内の一部を空白に置き換えるプログラムも正常に動作しません。
- この問題の解決方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1) > a[b] == a[b] + 1; これだと a[b] と a[b]+1を比較することになります。等しくないので 0 ; という文と同じ意味になります。 見掛け上なにも起りませんが、Cとして正しいプログラムです。 このように、Cで式に;を付けたものが、実行される文となります。 その式が意味があるものかどうかは関係ありません。 a[b] = a[b] + 1; の単純なミスでしょう。 なお、このような場合には、複合代入演算子やインクリメント/デクリメント演算子を使うと間違いを減らせます。 a[b] += 1 ; /* 複合代入演算子 */ a[b] ++ ; /* インクリメント演算子 */ あと、細かい点ですが > if(a[b] == '\n'){ 文字列の最後は改行とは限りません。終了を表すのは '\0'がよいでしょう。 (2) scanfの使い方と読み込んだ文字列の扱いによるものです。 ・scanfの %s では、空白文字は入りません。「空白文字」とはスペース、タブ、そして改行文字も含まれます。 ・改行文字が含まれないのですから >if(str[a] == '\n'){ >if(bag[a] == '\n'){ などという判定は無意味です。先にも書いた通り、'\0'にしてください。 scanfに関しては、次のURLも参考にしてください。 http://www9.plala.or.jp/sgwr-t/c/sec05.html これまた細かい点ですが > char str[100], bag[100]; この位置に書くと、グローバル変数になります。 特に理由が無い場合は、使用する関数の中(今回ならmain関数の中)に書いた方がいいです。 あと、文字列の長さ測ってますが、次の様にすれば数える必要がなくなります どうなっているか、はfor文の動作ついてよく調べてみてください。 int str_space(char str[], char bag[]){ int a, b; for(a = 0;str[a] != '\0'; a++){ for(d = 0; bag[d] != '\0'; d++){ if(str[a] == bag[d]){ str[a] = ' '; } } return 0; }
その他の回答 (2)
- not_ace
- ベストアンサー率52% (35/67)
プログラム自体は両方の問題ともほぼ合っていますが、 細かいところが間違っているので動かない状態です。 プログラムは正直一字一句間違っても許されないと思ったほうが良いので 作成する際には気をつけましょう。 難しい話は書かずに修正点だけ書きます。 1問目 if(a[b] == '\n'){ この行の比較ですが文字列の末端に付くのは\nではなく\0です。 a[b] == a[b] + 1; この行のイコールが二つになっているので値が代入されません。 2問目 1問目の同様 if(str[a] == '\n'){ if(bag[a] == '\n'){ 上記2行の比較は\0と行ってください。 以上の修正で両方とも期待通りの動作をすると思います。 勉強頑張ってください
お礼
動くようになりました。有難うございます。
- magicalpass
- ベストアンサー率58% (378/648)
(1)「==」で代入はできません。 (2)scanf()の結果に改行は入りません。
お礼
とてもよくわかりました。 有難うございました。