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

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

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

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

Q&A

解決済

3回答

1102閲覧

scanfの%dについて

dsajkldf

総合スコア5

C

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

0グッド

0クリップ

投稿2021/08/19 21:56

編集2021/08/19 23:18

scanfについてなのですが、

C

1scanf("%d%d",&変数名,&変数名); 2scanf("%d %d",&変数名,&変数名);

このプログラムで
なんの問題もなく、プログラムが読み込まれるのですが、
どうして、空白を開けない場合と開けた場合では違いがでないのですが、どうしてなのでしょうか?

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

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

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

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

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

dodox86

2021/08/19 23:14

質問と直接関係ない指摘かもしれませんが、 > scanf("%d%d",&変数名,変数名); の2つ目の変数名にも&が必要です。 正: scanf("%d%d",&変数名,&変数名); 付けないで実行した場合、別の意図しない結果になります。そのことも含めての話であれば質問自体の意味が変わるので確認してください。
dsajkldf

2021/08/19 23:18

回答ありがとうございます。 気づきませんでした。 ご指摘ありがとうございます。 修正しました。
guest

回答3

0

C言語ってのは、実行時のエラーチェックは全く行いません。
なので、たとえ異常な動作をさせても、エラーは出ないし、その後はどうなるか不定です。

不定ということは、そのまま落ちるかもしれないけれど、そのまま何事もなく実行する(ようにみえる)かもしれないってことです。
ということで、違いがでない、とあなたが思うならそうかも知れません

#ましかし、常にそう動くわけでもない、ってところがポインツ

投稿2021/08/19 23:09

編集2021/08/19 23:10
y_waiwai

総合スコア88042

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

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

dsajkldf

2021/08/19 23:16 編集

回答ありがとうございます。 実行時のエラーチェックを行わないというのは初めて知りました。驚きです。(まだ、実感が湧かないです。) すみません。新たな疑問が生まれたのですが、 scanfというのは%d %dのようにスペースを開けて書く方が良いのでしょうか? もしくは%d%dのように詰めて書く方が良いのでしょうか? それとも時と場合によるのでしょうか?
y_waiwai

2021/08/19 23:18

それはあなたがなにをそいつにさせたいか、によります。 scanf(に限らずあらゆるコード)は、書かれたとおりに動きますし、書かれたとおりにしか動きません
dsajkldf

2021/08/19 23:21

返答ありがとうございます。 なるほどです。奥が深いですね。 勉強になります。
dodox86

2021/08/20 00:43

> 実行時のエラーチェックを行わない 受け取り方によっては質問者さんに誤解を生みそうなやり取りに思うので、横から補足させていただきますが、scanf()にも返り値(帰り値、戻り値)があります。その返り値をコードを書いたプログラマーが責任を持って判定して正常か異常、エラーか決める必要があるということです。scanfでは入力された項目数などが返り値に示されます。詳細は関数リファレンスを確認してください。
episteme

2021/08/20 02:11

言語仕様のエラーとライブラリ(関数)のエラーをいっしょくたにしてません?
dodox86

2021/08/20 02:18

@epistemeさん 私も(私のコメントを含め)どの部分のエラーを指して話が進んでいたのか違和感を感じてました。
kazuma-s

2021/08/20 03:08

この回答は、質問が修正される前の scanf("%d%d", &変数名, 変数名); で & が抜けていることについてのもので、 scanf の書式の空白がどういう意味を持つのかという質問への回答ではありません。
episteme

2021/08/20 03:39

「空白を開けない場合と開けた場合では違いがでないのですが、どうしてなのでしょうか?」に対する回答じゃないのか。ならば低評価。
guest

0

"%d %d"の場合、データの間に空白(ホワイトスペース:空白文字とかタブ文字とか改行文字とか)がある形式にマッチしますが、
"%d"自体に「先頭の0個以上の空白を読み飛ばす」という働きがあるからです。

"123 456"
を"%d %d"で処理すると、"123"が最初の%dに、" "が書式指定の空白に、"456"が二番目の%dにマッチします。
"%d%d"の場合は、"123"が最初の%dに、" 456"が二番目の%dにマッチします。

投稿2021/08/19 22:07

thkana

総合スコア7703

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

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

dsajkldf

2021/08/19 23:02

回答ありがとうございます。 つまり、書き方としてはどちらでもよいという事でしょうか?
thkana

2021/08/20 00:07

「よい」というのは評価基準次第ですが、とにかく同じ結果が得られます。
guest

0

ベストアンサー

scanf(書式、引数...) において、引数は格納先へのポインタです。

書式は、複数の指令を並べたものです。

指令には、次の 3種類があります。
・空白類文字 (isspace関数で規定される文字 ' ', '\t', '\n', '\v', '\f', '\r')
・通常の文字
・%で始まる変換指定

指令の空白類文字は、入力の 0個以上の空白類文字を読み飛ばします。

指令の通常文字は、それと一致する入力文字を読み飛ばします。

変換指定は、%d, %s, %c などですが、%c と %[ と %n 以外は、
入力の空白類文字を読み飛ばした後、指定した変換処理を行います。

scanf("A=%d", &n); なら、"A"、"="、"%d" の 3つの指令があり、
入力の "A=45" や "A= 45" で、n に 45 を読み込めますが、
入力の "45" や "A = 45" では、n に 45 を読み込めません。

%d は数字の列を読み込んで数値に変換しますが、
数字の列の終わりを知るために、1つ余分に文字を読み込みます。
しかし、その文字は入力バッファに押し戻されて、次の入力に使用されます。

以上の scanf の基本的な機能を理解できましたか?
コメントをお願いします。

"%d%d" は、%d %d" や "%d\t%d" や "%d\n%d" と同じ処理結果になります。

投稿2021/08/20 01:45

編集2021/08/20 02:45
kazuma-s

総合スコア8224

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

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

dsajkldf

2021/08/20 02:52

回答ありがとうございます。 まだ、ポインタという概念が分かっていなく、半分理解して、半分理解できていない状態です。 ですが、勉強を繰り返して、また、この回答文を見てみようかと思います。 貴重な回答ありがとうございます。
kazuma-s

2021/08/20 03:00

scanf("%d", n) ではなく、scanf("%d", &n)。n は int。&n は「int へのポインタ」。 ポインタの理解は置いといて、書式の理解はどの程度できましたか? 分からないところはどこですか?
dsajkldf

2021/08/20 03:12 編集

返答ありがとうございます。 すみません。バカに思われても仕方がないのですが、 読みとばすの意味がイマイチ分からないです…。
kazuma-s

2021/08/20 03:21 編集

指令に対応する文字を読み込んで、変換は行わず、どこにも格納しないという意味です。 読み捨てると言い換えても構いません。 書式が "%d" だと、入力は "45" 以外に " 45" でも "\n\t 45" でも構わない。 " " や "\n" や "\t" は読み込んで捨てるという意味です。それに続く"45" は変換して格納します。 書式が "A=%d" だと、入力の先頭が A でないと、そこで scanf は処理を終了します。 A でない入力文字は入力バッファに押し戻されます。
dsajkldf

2021/08/20 05:52

返答ありがとうございます。 読み飛ばすの説明ありがとうございます。 おかげで理解できました。 scanfにA=などの文字を入れることをできるのは初めて知りました。 何から何までありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問