質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1820閲覧

putcharで文字を表示させたいのですができません

sawayakaunagi

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/10/23 01:41

putcharを使って文字を表示させたいのですが表示されないです。
どこが間違っているでしょうか?

c

1コード 2#include <stdio.h> 3 4int main() 5{ 6 char str[] = "hi there"; 7 int i; 8 printf("%s\n",str); 9 printf("%d\n",i); 10 while ( str[i] = '\n') 11 { 12 putchar(str[i]); 13 putchar('\n'); 14 } 15 return 0; 16} 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/23 02:01

コード書いた→コンパイルした→実行した→思い通り動かない→そうだ質問しよう! じゃなくて、デバッグして、もう少し考えてみませんか。
guest

回答2

0

ベストアンサー

まず、基礎からやりましょう
基礎を蔑ろにしている人には教えたくないほどです。
だって、読もうとすらしないし、仮に読んだとしても基礎がわかっていないから最初から教えないといけない。
確かに軽いものであれば教えることができます。ですが、足し算すらわからない人に微積分を説明するのって相当大変です。
それなのに、『はぁ?なんで基礎をやらんといけんの?』と言われたらね…

なので基礎からやりましょう。今回の場合、基礎ができていれば簡単にわかることです。

ではいきましょう。

一つ目。プログラミングとは現実世界のシミュレーションである

プログラミングっていうのは『こう書けばいい』ではありません。
現実世界のシミュレーションです。

二つ目。コードを読もう

一つ目の発想でコードを読みます。
コードを読むコツは、『一行レベルで、その行が何をしているかを考えながら読む』です。

今回の場合、

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’なので、改行しかありません。よって人間の目には、何も表示されずに、なぜか空白の行がずらずらと出てくる感じになります。

つまり、基礎ができていないことが原因です。
基礎ができていれば対応できるはずです。

投稿2021/10/23 02:23

編集2021/10/23 03:16
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/23 02:33

細かくてすみませんが、 > 『存在しない場所にアクセスしているため、Segmentation Falutになる』はずです。 "はず"なので微妙な表現ですが、ならないときも多くあります。コードの見た目、範囲外でも書き込みアクセス可能な範囲内であればSegmentation Faultにはなりません。
BeatStar

2021/10/23 02:37

@ dodox86さん > コードの見た目、範囲外… あ、確かにそうですね。
dodox86

2021/10/23 02:41

私のコメントも少し間違っていました。書き込みアクセス可能に限らず、「読み取り」もそうですね。その時プロセスに割り当てられているデータ用のメモリ領域の範囲外にアクセスしたら、と言ったところでしょうか。
guest

0

・iを初期化していない
・whileの条件が「=」で代入のうえ比較対象も違う。
・whileのブロックのどこにもiを動かす処理がない。
for文にしたら? for(i=0; str[i]; i++)

投稿2021/10/23 01:58

matukeso

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問