まず、基礎からやりましょう。
基礎を蔑ろにしている人には教えたくないほどです。
だって、読もうとすらしないし、仮に読んだとしても基礎がわかっていないから最初から教えないといけない。
確かに軽いものであれば教えることができます。ですが、足し算すらわからない人に微積分を説明するのって相当大変です。
それなのに、『はぁ?なんで基礎をやらんといけんの?』と言われたらね…
なので基礎からやりましょう。今回の場合、基礎ができていれば簡単にわかることです。
ではいきましょう。
一つ目。プログラミングとは現実世界のシミュレーションである。
プログラミングっていうのは『こう書けばいい』ではありません。
現実世界のシミュレーションです。
二つ目。コードを読もう。
一つ目の発想でコードを読みます。
コードを読むコツは、『一行レベルで、その行が何をしているかを考えながら読む』です。
今回の場合、
c
1
2int main()
3{
4 // 配列areを用意し、”hi there” を入れる
5 char str[] = "hi there";
6 // 変数 i を用意する
7 int i;
8 // strの値を出力する
9 printf("%s\n",str);
10 // i の値を出力する
11 printf("%d\n",i);
12 // 『str[i]に’\n’を代入している間』
13 while ( str[i] = '\n')
14 {
15 // str[i]の場所の値を出力
16 putchar(str[i]);
17 // 改行もしておく
18 putchar('\n');
19 }
20 // 終了
21 return 0;
22}
という感じですね。
ではこれを疑似コードとして書き出してみましょう。
1. 配列strを用意し、”hi there”を入れる
2. 変数i を用意
3. 配列strの値を出力
4. 変数iの値を出力
5. str[i] に’\n’を代入している間
5.1. str[i]の値を出力
5.2. 改行もつける
6. 終了
ですね。
これをゲームの操作方法でも数学の解き方でもなんでもいいので、これの通りに実際に現実世界でやってみましょう。
まず、(1)はいいのですが、(2)は初期化されていません。
もしかしたら質問者さんの環境ではi = 0 となっているかもしれませんが、常に0とは限りません。
初期化をしない場合、処理系とかによっては、0以外の、不定値になることが多いです。
たとえば、2243とか。
そうなると、今後、意味が変わってくると思います。
(5)では、『代入』となっています。
C言語やC++のような言語での条件式の比較と代入は別物です。
比較する方法はご自分で調べてください。入門書にもがっつり載っていることです。
それに、str[i] ですが、iの中身はなんでしょうか。
たとえば2324だと、
str[2324] ってことになってしまいます。
でも用意されたstrの要素数は明らかにそれより少ないです。(数えていないけど20すらない)
『存在しない場所にアクセスしているため、Segmentation Falutになる』はず可能性があります。
20階建てのビルなのに、『100階にいく』ようなものです。物理的に無理。
よって、使えない。(可能性あり)
仮にたまたまその処理系の初期値が0の場合、
str[0]に代入して出力しますが、終了する条件がないため、無限ループになります。
さらに仮に終了条件があったとしても、
str[i]に入っているのは、’\n’なので、改行しかありません。よって人間の目には、何も表示されずに、なぜか空白の行がずらずらと出てくる感じになります。
つまり、基礎ができていないことが原因です。
基礎ができていれば対応できるはずです。