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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

2回答

1460閲覧

scanfで改行文字を入れるとデバッグではエラーが出ないのに先に進めなくなる理由が知りたい

tsunaobou

総合スコア3

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

0クリップ

投稿2020/08/25 06:46

編集2020/08/25 07:15

前提・実現したいこと

デバッグではエラーが出ないのに、入力してエンターキーを押すと先に進まない原理が知りたいです。

発生している問題・エラーメッセージ

整数を入力してエンターキーを押すと先に進めなくなる。

該当のソースコード

C

1#include<stdio.h> 2int main(void) { 3 int limit; 4 printf("limitを入力してください:"); 5 scanf("%d\n", &limit); 6 return 0; 7} 8

試したこと

改行の\nを外すと正常に次に進むことは確認できました。
また、回答を参考にして数字を2回入力すると正常にプログラムが終了することがわかりました

補足情報(FW/ツールのバージョンなど)

Windows 10 Home ver.1909
Visual studio 2019

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

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

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

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

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

guest

回答2

0

ベストアンサー

man scanfより:

ホワイトスペース (スペース、タブ、改行など; isspace(3) 参照) の列。この命令は、入力中の任意の個数のホワイトスペースに一致する。(「何もなし」にも一致する)。

つまり、scanfの書式文字列中では、\n空白\tも同じ意味で、「空白文字0個以上」にマッチします。
そのため、空白文字が連続している限り\nは完結しません。完結させるためには、空白文字以外を入力する必要があります。その文字は次のscanfで取り込み対象となります。

投稿2020/08/25 07:25

otn

総合スコア84645

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

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

otn

2020/08/25 07:33

あと、 > デバッグではエラーが出ないのに おそらく「デバッグ」という概念を理解できていません。
tsunaobou

2020/08/25 11:02 編集

理由がわかりました。scanfの仕様を知ったら理解できました。 入門書をもう一度読み直そうと思います。 ありがとうございました。
thkana

2020/08/25 12:08

この辺のことをちゃんと書いてある入門書って見たことないです... 何を見るのがいいんだろう?
otn

2020/08/25 14:34

端末からの入力にはscanfを使わず、fgets+sscanfを使うのがいいです。 必ずsscanfの返り値はチェックする。
tsunaobou

2020/08/26 06:47

まだC学び始めたばかりだったのでそんなやり方があるとは驚きでした... ありがとうございます!
otn

2020/08/26 08:00

scanfだと、入力と解析を1つの関数で行うので、期待通りでない入力に対して再入力を求めるのが難しい。 入力はfgetsで解析はsscanfでやって、sscanfの返り値をみれば期待通りの入力だったかどうかがわかるので、期待通りでなければfgetsに戻ってやり直せば良いです。 EOFの考慮も行うとこれくらい。 char line[100]; while(1){ if(!fgets(line, sizeof line,stdin)) { fprintf(stderr,"数字の入力がないままEOFになりました。プログラムを終了します。\n"); exit(1); } if(sscanf(line, "%d", &limit)==1) break; fprintf(stderr,"数字が入力されませんでした。数字を入れてください。\n"); }
guest

0

このコードでは、数値と\n文字が来るまで待ちます、が、Enterキーで入力されるのは\r文字です。
なので、待ったまんまですね

投稿2020/08/25 07:02

y_waiwai

総合スコア87784

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

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

asm

2020/08/25 07:23

標準入力のデフォルトはバイナリモードではなくテキストモードだったはずですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問