シャドウ さんが書きました: ↑5年前
#3 のプログラムで scanf の書式の "%d %d " に問題があることを指摘しているのに
>>あ、確かに間違ってますね、コロン間についてませんでした。
これじゃ大問題ですね。
コロン(:) ではなく、コンマ(,) ですね。
何度も何度もしつこく指摘して申し訳ありません。
あなたの質問が曖昧で、疑問点が多く、回答するのが難しいからなのです。
まず、タイトルの「cinで入力した数値を横並びにしたい」ですが、
これを見ると、
・cin による数値の入力方法が分からない
・2個またはそれ以上の個数の数値を横に並べて表示する方法が分からない
だと解釈できます。
cin を使っていることから、プログラミング言語は C++ だと分かります。
本文には、「Scanfだと入力した数値が横並びにできるのですが」と
あるので、横に並べて表示するのはできるんだと分かります。
printf を使うのか、cout を使うのかは知りませんが。
「それはエラーや、変なコードを記述しなければならなくなるのでCinのほうで」
えっ? 何を言っているのだろう。遊び人さんも同じように思ったのでしょう。
#2 で scanfで書いたプログラムの提示をアドバイスしています。
#3 で、scanf を使うと、「エラー C4996」になると返答しています。
記述しなければならない変なコードとは「 #define _CRT_SECURE_NO_WARNINGS」
のことだと私は思いました。
#4 の遊び人さんの回答は完璧で、
・cin による数値の入力方法
・cout による横並びの表示方法
が示されています。
scanf に関することもちゃんと説明されています。
#5 で、「変なコード」すなわち「余計なコード」をソースプログラムに
書かなくても済む方法として、「構成プロパティ」の修正をアドバイスしました。
これで、このトピックの質問回答は完了し、問題は解決となるのですが、
#3 の scanf("%d %d ", のプログラムについて、ちょっと問題があるので、
次のように指摘しました。
これで、コンパイルは通ると思うので、次に実行してみてみると
不思議な現象が発生するはずです。
scanf の書式の " " (スペース)の意味を調べてみてください。
でも、シャドウさんからは、実行してみましたという返事はもらえませんでした。
なぜ「不思議な現象が」と言われて実行してみないでしょう?
プログラマは好奇心を持って何でもやってみるという姿勢でないとやっていけない
と私は思っています。
やってみましょう。
コード:
123
45
あれ? 2つ数を入力したのに、結果が表示されないぞ。もう一つ入れてみよう
678
123 , 45
変ですよね。結果が表示されない時に、Enter を何個入力してもダメで、
何か文字(数字でなくてもよい)を入力しないといけないのです。
これは、scanf の書式の "%d %d " の最後のスペースによるものです。
scanf をググっても、網羅的に説明しているところはなかなか見つかりませんが、
「man scanf」で検索すると、scanf のマニュアルページが出てきます。
SCANFには、次の説明があります。
format 文字列は 「命令」 (directive) の列で構成される。命令は入力文字の
系列をどのように処理するかを指示する ものである。ある命令の処理が失敗する
と、入力はそれ以上読み込まれず、 scanf() は返る。「失敗」は 「入力の失敗」
(input failure) と 「一致の失敗」 (matching failure) のいずれかである。
入力の失敗は入力文字が使用できなかったことを意味し、 一致の失敗は入力が
不適切であったこと (下記参照) を意味する。
命令は以下のいずれかである:
・ホワイトスペース (スペース、タブ、改行など; isspace(3) 参照) の列。
この命令は、入力中の任意の個数のホワイトスペースに一致する。
(「何もなし」にも一致する)。
・通常文字 (つまり、ホワイトスペースと '%' 以外の文字)。 この文字は入力
の次の文字に正確に一致しなければならない。
・変換指定。変換指定は '%' (パーセント) 文字で始まる。 入力された文字の
系列はこの指定にもとづいて変換され、 変換結果は対応する pointer 引き数
が指す場所に格納される。 入力の次の文字が変換指定と一致しない場合は、
変換は失敗する ---これが 「一致の失敗」 (matching failure) である。
"%d %d " の最後のスペースは、ホワイトスペースの列が終了するまで
入力を要求し続けるのです。Enter を何個入力しても、それはホワイトスペース
です。ホワイトスペース(JISの規格書では空白類文字)でない、何かの文字を
入力することで scanf の実行が完了します。
なお、何かの文字はホワイトスペースではないので、入力バッファに押し戻され
次の入力として使用されます。