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

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

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

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

Q&A

解決済

3回答

1995閲覧

C言語の空白区切り入力と繰り返し文

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2020/06/14 06:22

解決したいこと:scanf_sで2次元配列に1つ数を入力するごとにスペースを入力してにいき、1行終わるごとにenterを押してループさせる。
下のコードで実行するとenterを押すとループするときにscanf_sが飛ばされてprintfの部分だけが実行されて終わってしまう。

#include<stdio.h> #define T 5 #define L 9 int main(void) { int f[L][T], i, k, avg; int tmp[T] = { 0 }; printf("9人の学生のテストの点数を入力します\n"); for (int i = 0; i < L; i++) { //printf("%d人目の点数を入力 ", i + 1); for (int k = 0; k < T; k++) { scanf_s(" %d", &f[i][k]); } } printf("\n"); for (i = 0; i < T; i++) { for (k = 0; k < L; k++) { tmp[i] = tmp[i] + f[k][i]; } avg = tmp[i] / L; printf("科目%dの平均点は%.1f点です\n", i, avg); } return 0; }

下のコードだとうまくいく

#include<stdio.h> int main(void) { int A[3][4]; int a[4][3]; printf("3行4列行列を入力してください\n"); for (int i=0; i < 3; i++) { for (int k = 0; k < 4; k++) { scanf("%d", &A[i][k]); a[k][i] = A[i][k]; } } printf("転置行列は\n"); for (int i = 0; i < 4; i++) { for (int k = 0; k < 3; k++){ printf("%d ", a[i][k]); } printf("\n"); } return 0; }

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

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

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

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

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

guest

回答3

0

よく見ると、

scanf_s(" %d", &f[i][k]);

%d の前、全角の空白ですが、これを半角の空白とするとどうなるでしょうか?

投稿2020/06/14 07:14

pepperleaf

総合スコア6383

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

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

退会済みユーザー

退会済みユーザー

2020/06/18 00:10

返信遅れてすみません。試してみたいと思います。
guest

0

ベストアンサー

もともとscanfやscanf_sは、空白区切りの入力を行うもんで、

scanf("%d", &A[i][k]);

でいけます。
この空白区切りというのは改行コード(Enter)も空白として判断されるためうまくいきます
が、

scanf_s(" %d", &f[i][k]);

だと、空白文字決め打ちで文字が来ないとだめです。
改行コードではマッチしなくなります

投稿2020/06/14 06:33

編集2020/06/14 06:33
y_waiwai

総合スコア87749

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

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

退会済みユーザー

退会済みユーザー

2020/06/14 06:44

scanf_s(" %d", &f[i][k]);というようにすると区切り方がスペースに限定されてしまうという認識であっていますか?
y_waiwai

2020/06/14 06:51

フォーマット文字列のなかの文字はそれが来ないとマッチしなくなるため、 「Enter」数字、では取れなくなりますね
guest

0

scanf_s("全角空白%d",&f[i][k]);
になっているからです。これだと、入力時にも
全角空白数字全角空白数字...と入力しないとマッチしません。

scanf_s(" %d",&f[i][k]);(%dの前は半角空白)なら、0以上任意個の空白文字(isspace()で真になる、空白、水平タブ、改行 等)について読み飛ばすだけになります...が、もともと書式指定%d自体が空白文字を読み飛ばすのであってもなくても同様です。

1つ数を入力するごとにスペースを入力してにいき、1行終わるごとにenterを押し

1つ数を入力する毎にEnterを押したとしても、scanf(_s)書式指定"%d"の動作はなにも変わりません。

投稿2020/06/14 07:29

編集2020/06/14 07:42
thkana

総合スコア7629

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問