すでに解決済みになっていますが、気になるので回答します。
Ⅰ. 基礎を理解すべし
基礎が出来てから応用が出来ます。
でも質問を見る限り、『基礎が出来ていない』気がします。
Ⅱ. 用語はちゃんと使うべし
scanfで入力された文字列をchar型関数strに格納
char型『関数』ではなく『配列』では?
関数と配列は別物です。
一応、コードと文章から『配列』であることはわかりますが、
文章だけだと回答者はわからなくなります。
場合によっては『いや、これは変数だろ』とかってわかる事もありますが、
基本的にはわかりにくい。
そうなると質問者の意図と回答者の解釈がすれ違って、頓珍漢な回答になってしまいます。
人間同士ですらこれですから、プログラミングなんてきついです。
プログラミングは「機械とのコミュニケーション」です。
なので用語はちゃんとしましょう。
Ⅲ. 可読性を上げるべし
質問にあるコードではインデント(半角スペースやTabキーでやるアレ)が滅茶苦茶です。
読めなくはないですが、読む気が失せます。
日本語で書けば、
オイラは数学が苦手なんだな。
だけど お金は 好 きなんだな。
だから
東 京 さ出て、
お 金 を
も
う
けるんだな。
のような感じに近いです。(内容は適当)
読む気、失せますよね?
初心者の内は仕方ないですが、会社での開発はチーム開発のようです。
そうなると複数人で開発することに。
でもそういう読みづらいものを書くとどうなるでしょうか。
仮に自分ひとりで開発するとしても、プログラムは書いて終わり……じゃなく、
保守とかもします。
一か月前の自分が書いたコードなんて忘れているのが当たり前のレベルです。
なので、読みやすいコードを書くように心がけましょう。
Ⅳ. コードを読むときは『この行が何をしているか』を考えながら読むべし
他人が書いたコード、自分が書いたコード関係なく、コードを読むときは、
『一行レベルで、何をしているのかを考えながら読む』です。
たとえば、ソースコードとしてのファイルをバックアップ(あるいは単なるコピー)を取っておいて、
一行レベルでコメントにする。とかです。
実際にやってみましょうか。
C
1// 変数iの初期値: 0, 配列の中身が終端文字でない間, +1しながらループ
2for (i = 0; str[i] != '\0' ; i++) {
3 }
4 // フラグ? は、iを2で割った余りとする
5 flag = i % 2;
6
7// フラグ? が 0 (= 偶数) なら
8if (flag == 0) {
9 // 変数j の初期値: 0, j が iの2分の1 未満の間, +1 しながらループ
10 for (j = 0; j < i / 2; j++) {
11 // 変数 tmp に str[j] の値をセット
12 tmp = str[j];
13 // str[j] は str[i - j] の値とする
14 str[j] = str[i - j];
15 // str[i-j] は tmp の値とする
16 str[i - j] = tmp;
17 // → つまり、str[j] と str[i - j]を入れ替える
18 }
19 }
といった感じです。
これを日本語でも中国語でも英語でも韓国語でもスペイン語でもなんでもいいので、
自分が読み書きできる言語で書き下す。
C
11. ユーザ入力によって文字列を受け取り、配列 str にセット
22. 配列の長さを forを使って調べる(= 変数 i にセット)
33. (2)で得た長さを2で割ったときの余りを取得( flagにセットし、偶数・奇数を判断するため )
44. 長さが偶数なら
5 4.1. 変数j の初期値: 0, j が iの2分の1 未満の間, +1 しながらループ
6 4.2. str[j] と str[i - j] を入れ替える
75. それ以外(= 長さが奇数)なら
8 ...
96. 結果(strの値)を出力する
と言う風にやる。(疑似コード?)
これを現実世界で、手作業でやってみる。
数学の問題とかのような感じで。
脳内でもいいです。とにかくやってみる。
そうすると、(5.1) に相当する部分が(4.1)と同じになっています。
でも質問者さんのお考えでは、『文字列の半分ー1まで繰り返す』ですよね?
計算が合いません。
このように、自分が考えたロジックとの差異を見付けるためにもこういう考え方を学ぶべきです。
Ⅴ. 『現実世界でならどうするか』を考えるべし
プログラミングは元々、『現実世界でのシミュレーション』です。
『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。
よって、『現実世界でならどうするか』を考えるのです。
そうすると、
C
1[言い換えQ]
2
3ある人(Aさん)が単語を言うので、それの逆から読んだ単語を書いてくれ。
4
5例:
6point -> tniop
この場合、どうしますか?
私なら、
C
11. ホワイトボードを用意する
22. ホワイトボードに Aさんが言った単語をを書く
33. (2)の単語を後ろから読み込んで
4 3.1. 一文字ずつ余白に書いていく
54. 余白に書いた単語が結果的に答えになる
ですかね。
別に『偶数なら~』とかやらなくてもこれぐらいならできますよね。
単純にこれをやればいいだけです。
(上記はホワイトボードですが、ノートでも黒板でもなんでもいいです)
シンプルにできるならシンプルな方が望ましいです。
(アルゴリズム的に無理だったり、計算量を意識して……とかだと別ですが)
シンプル イズ ベスト!
注意!: 別に質問にあるような考え方でもいいです。(ロジックと仕様さえ合っていれば)
質問者さんなりに考えてのロジックなので問題ありません。
別にダメということではなく、あくまで私の考えです。