cinで入力した数値を横並びにしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シャドウ

cinで入力した数値を横並びにしたい

#1

投稿記事 by シャドウ » 5年前

こんにちは、今プログラムの例題の勉強をしているのですが、
Scanfだと入力した数値が横並びにできるのですが、それはエラーや、変なコードを記述しなければならなく
なるのでCinのほうで、入力した数値を横並びにできるようにしたいのですが、無理でしょうか?
ご教示お願いします。

遊び人
記事: 42
登録日時: 6年前

Re: cinで入力した数値を横並びにしたい

#2

投稿記事 by 遊び人 » 5年前

入力した数値を横並びに表示したいのでしょうか?
言葉だけでは理解しにくい部分もあるので、scanfで書いたプログラムをここに提示してくれれば、より正確な回答を得られると思いますよ。

シャドウ

Re: cinで入力した数値を横並びにしたい

#3

投稿記事 by シャドウ » 5年前

コード:

#include<stdio.h>

int main(void){

	int data1, data2;
	scanf("%d %d ", &data1, &data2);
	printf("%d , %d\n", data1, data2);
	return 0;
}
です。
エラーは、
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

遊び人
記事: 42
登録日時: 6年前

Re: cinで入力した数値を横並びにしたい

#4

投稿記事 by 遊び人 » 5年前

std::coutというのは独特で、<<(左シフト演算子のオーバーロード)を利用して文字等を出力します。←まだ覚えなくていい
変数や文字列同士は << で区切ると覚えておいてください。

コード:

#include <iostream>

int main() {
	int data1 = 0, data2 = 0;

	// 数値を入力
	std::cin >> data1 >> data2;
	// 横並びに出力
	std::cout << data1 << ", " << data2 << std::endl;

	return 0;
}
また、scanfのエラーですが、scanfやfscanfなどは、バッファオーバーランの危険性がある為、Visual C++では推奨されておりません。そのエラーは要するに、「こんな危ない関数使っちゃってるけど大丈夫?」というただの警告です。
プログラム自体は問題なく動きますし、ほかのコンパイラであればそのような警告は出ません。
Visual C++でscanf等を使用する場合は、以下のコードをプログラムの最初のほうに貼ってあげれば警告は出なくなります。

コード:

#define _CRT_SECURE_NO_WARNINGS

かずま

Re: cinで入力した数値を横並びにしたい

#5

投稿記事 by かずま » 5年前

遊び人 さんが書きました:
5年前
また、scanfのエラーですが、scanfやfscanfなどは、バッファオーバーランの危険性がある為、Visual C++では推奨されておりません。そのエラーは要するに、「こんな危ない関数使っちゃってるけど大丈夫?」というただの警告です。
プログラム自体は問題なく動きますし、ほかのコンパイラであればそのような警告は出ません。
Visual C++でscanf等を使用する場合は、以下のコードをプログラムの最初のほうに貼ってあげれば警告は出なくなります。

コード:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
の代わりに、
#pragma warning(disable:4996)
と書いても警告は出なくなります。

ソースを変更したくなければ、プロジェクトのプロパティを開いて、
次の設定をしてください。

「構成プロパティ」の「C/C++」の「詳細設定」で、
「指定の警告を無視する」に 4996 を追加する。あるいは、

「構成プロパティ」の「C/C++」の「全般」の「SDLチェック」の
「はい(/sdl)」を削除する。または「いいえ(/sdl-)」に変更する。

これで、コンパイルは通ると思うので、次に実行してみてみると
不思議な現象が発生するはずです。

scanf の書式の " " (スペース)の意味を調べてみてください。

シャドウ

Re: cinで入力した数値を横並びにしたい

#6

投稿記事 by シャドウ » 5年前

かずまさん遊び人さん回答ありがとうございます。
””はダブルクォーテーションで文字列リテラルって意味ですよね。

かずま

Re: cinで入力した数値を横並びにしたい

#7

投稿記事 by かずま » 5年前

シャドウ さんが書きました:
5年前
かずまさん遊び人さん回答ありがとうございます。
””はダブルクォーテーションで文字列リテラルって意味ですよね。
文字列リテラル "%d %d " は、scanf の書式ですが、
その書式の中の " " にはどういう意味がありますかと尋ねています。
また、"%d" がどういう入力を読み込むか正確に説明できますか?

#3 のプログラムは、コンパイルエラーで実行できなかったようですが、
回答による修正で、コンパイルおよび実行ができるようになりましたか?
実行して思い通りの動作をしましたか?
実際にどんなふうにデータを入力しましたか?
#4 の C++ のプログラムで問題は解決したのですか?

フォーラム(掲示板)ルールから抜粋
d 義務行為

 "C言語何でも質問掲示板"でのみ適用される事項
   ・トピックを立て、解決した場合は「解決しました」とだけ書かず、
    どうやって解決したか他の人に分かるように書いてからトピックを
    終了して下さい。
   ・複数の回答者がいた場合、都合の良い、または自分の気が向いた
    回答者にだけ返信を書かず、回答をくれた人全員に対して出来る
    限りの返信を書きましょう。
   ・回答者のコメントの中に複数質問があった場合、出来る限りその
    全てに答えるようにしましょう。

シャドウ

Re: cinで入力した数値を横並びにしたい

#8

投稿記事 by シャドウ » 5年前

こんにちは、すみません一つずつ詳細に答えます;

文字列リテラル "%d %d " は、scanf の書式ですが、
その書式の中の " " にはどういう意味がありますかと尋ねています。

>> プログラミング言語などにおいて記述される、0文字以上の連続した文字列を示す定数のことです。
文字列リテラルを記述する際の記述方法としては、ダブルクオーテーションで囲んで「"string"」のように表記することが多いです

また、"%d" がどういう入力を読み込むか正確に説明できますか?
>>整数の10進を正常に読み込むと思います。

それから私が実際に入力した構文です。
今回はscanf_sを使いました。
エラーを回避するコードの方法もありましたが、scanf_Sを使うとそれだけで上手く行ったので。

コード:

  
#include<stdio.h>

int main(void){

	int data1, data2;
	scanf_s("%d%d", &data1, &data2);
	printf("%d%d\n", data1, data2);
	return 0;




}


かずま

Re: cinで入力した数値を横並びにしたい

#9

投稿記事 by かずま » 5年前

シャドウ さんが書きました:
5年前
文字列リテラル "%d %d " は、scanf の書式ですが、
その書式の中の " " にはどういう意味がありますかと尋ねています。

>> プログラミング言語などにおいて記述される、0文字以上の連続した文字列を示す定数のことです。
文字列リテラルを記述する際の記述方法としては、ダブルクオーテーションで囲んで「"string"」のように表記することが多いです
これは「文字列リテラル」の説明です。私が質問しているのは、
「scanf の書式のスペース」にはどういう意味がありますか、ということです。

・#define _CRT_SECURE_NO_WARNINGS
・#pragma warning(disable:4996)
・「指定の警告を無視する」に 4996 を追加
・「SDLチェック」の「はい(/sdl)」を削除
のいずれも採用せず、scanf の代わりに scanf_s を使ったというのなら
それでもいいのですが、
「scanf_sを使いました」や「scanf_Sを使うと」のように全角半角や
大文字小文字に無頓着なのはプログラマとして問題があると思います。

#3 のプログラムで scanf の書式の "%d %d " に問題があることを指摘しているのに
書式を "%d%d" に書き換えて「うまく行ったので」というのは的外れな返答です。

「一つずつ詳細に答えます;」と言いながら、次の質問には答えていません。
・実際にどんなふうにデータを入力しましたか?
・#4 の C++ のプログラムで問題は解決したのですか?

プログラミングというのは緻密な作業の連続です。
細かいことにこだわるなあと思うようでは、
今後も様々な問題に遭遇して、困ることがたくさん出てきますよ。
オフトピック
return 0; と } の間に 4行も空行があるのはどういう意味があるのでしょうか?

かずま

Re: cinで入力した数値を横並びにしたい

#10

投稿記事 by かずま » 5年前

#8 のプログラムで「上手く行った」ということは、
「数値を横並びにしたい」というタイトルの意味は、
「数値を連結したい」という意味なんでしょうか?

シャドウ

Re: cinで入力した数値を横並びにしたい

#11

投稿記事 by シャドウ » 5年前

遅くなってすみません、
指摘ありがとうございます。
すみませんがScanfの""のスペースの意味は知りません;
ネットに乗っている情報ならいいんですが、

#8 のプログラムで「上手く行った」ということは、
「数値を横並びにしたい」というタイトルの意味は、
「数値を連結したい」という意味なんでしょうか?

>>数値を連結したいという意味です。

シャドウ

Re: cinで入力した数値を横並びにしたい

#12

投稿記事 by シャドウ » 5年前

#3 のプログラムで scanf の書式の "%d %d " に問題があることを指摘しているのに

>>あ、確かに間違ってますね、コロン間についてませんでした。
これじゃ大問題ですね。

かずま

Re: cinで入力した数値を横並びにしたい

#13

投稿記事 by かずま » 5年前

シャドウ さんが書きました:
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 の実行が完了します。
なお、何かの文字はホワイトスペースではないので、入力バッファに押し戻され
次の入力として使用されます。

シャドウ

Re: cinで入力した数値を横並びにしたい

#14

投稿記事 by シャドウ » 5年前

コード:

#include<stdio.h>

int main(void){

	int data1, data2;
	scanf("%d %d ", &data1, &data2);
	printf("%d , %d\n", data1, data2);
	return 0;
}
構成プロパティ修正してやって見ました。
結果2回入力しても出力されませんでした、3回目まで行ってしまいました。

cin による数値の横並びでの(33,55など)入力時読み込み方法が分からない
でした。
遊び人さんの、cinによる数値の入力方法も完璧です。
私が言いたかった事も、
記述しなければならない変なコードとは「 #define _CRT_SECURE_NO_WARNINGS」
のことだと私は思いました。
であっています。
一番簡単な命令で一行で数値を2回、読み込める方法を知りたかったのです。

なので解決しました、
専門的な事(プログラムの意味の解釈)にはまだまだ疎いのでもっとこれからも解らない事は、調べたり聞いたりしようと思います。

シャドウ

Re: cinで入力した数値を横並びにしたい

#15

投稿記事 by シャドウ » 5年前

質問文に一行が抜けてました、すみません・・・・・。
申し訳ありませんでした。

かずま

Re: cinで入力した数値を横並びにしたい

#16

投稿記事 by かずま » 5年前

シャドウ さんが書きました:
5年前
質問文に一行が抜けてました、すみません・・・・・。
衝撃的です。
やっと、ジャドウさんの質問したかったことが分かりました。

33 55
のように 1行に横並びに 2個の数がある場合、それを
cin で 1度に入力するにはどう書けばよいのでしょうか?
scanf なら、scanf("%d%d", &data1, &data2); でできますが、
cin を使うと、cin >> data1; cin >> data2; のように 2つの文に
なってしまいます。

ということですね。

回答は、cin >> data1 >> data2; です。

でも、勘違いしないでください。
scanf("%d%d", &data1, &data2); も cin >> data1 >> data2; も

33
55
のように横並びになっていない入力も読み込めてしまいます。
「横並びの入力」に何の意味もないのです。

1行に必ず 2個の数がないといけないようにしようとすれば、
別のコーディングが必要です。

また、33,55 という入力から 2つの値を取得しようとすれば
別のコーディングが必要です。

質問するときは、何をしたいのか具体的に例を挙げて説明しないと
回答者には伝わらないでしょう。

シャドウ

Re: cinで入力した数値を横並びにしたい

#17

投稿記事 by シャドウ » 5年前

こんばんは、お世話になっております。
そうでしたか、私はscanf("%d%d", &data1, &data2);だと33 55のように一行で二つの数値を読み込めると思っておりました。
あと、回答はこれからは具体例で説明できるように気をつけます。
これまで懇切丁寧に指摘、回答して下さってありがとうございました。
回答して下さった遊び人さん、かずまさんありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る