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

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

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

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

Visual Studio

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

Q&A

解決済

4回答

17850閲覧

C言語で空白を開けて文字と数字を入力させたい

Cpro

総合スコア15

C

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

Visual Studio

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

0グッド

0クリップ

投稿2019/06/30 06:27

編集2019/06/30 10:57

C言語で

ABC 123 987

といった感じで文字型と整数型を分けて入力させたいのですが、なかなかうまくできません。

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 char array[20]; 7 char arr[10]; 8 int num1; 9 int num2; 10 11 scanf_s("%s", array,sizeof(array)); 12 13//arrの後にsizeof(arr)が必要なのは分かりました 14 sscanf_s(array,"%s %d %d",arr,sizeof(arr),&num1,&num2); 15 16 printf("&s %d %d",arr,num1,num2); 17 18 return 0; 19} 20

改行して入力させるのは簡単なのですが、空白で入力させるのができなくて困っています。
どなたか教えていただけないでしょうか?

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

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

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

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

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

rubato6809

2019/06/30 09:53 編集

分解する文字列 "ABC 123 987" が array[20] に格納された後、sscanf_s() を呼び出す、のでしょうか?
Cpro

2019/06/30 10:40

入力と同時にarray[20]に格納して、arrとnum1,num2に分解させたいということです。 いまいちsscanf_s()の使い方を把握していないのですが、こういう解釈で大丈夫ですかね?? 説明不足で申し訳ないです。
rubato6809

2019/06/30 10:43

では、貴方の希望・説明を問題文に反映させてください。
rubato6809

2019/06/30 10:57 編集

修正した問題文に「入力と同時にarray[20]に格納して」に相当する説明が見当たらない。特に「同時に」とは、何と何が同時なのか、わかりやすい説明が欲しい。
Cpro

2019/06/30 11:00

とてもお恥ずかしい話ですが、sscanf関数が入力と分解同時にできる関数だと勘違いしていました。 ただ、修正した分でも上手く動作しません。よければ教えていただきたいです。
cateye

2019/06/30 11:59

素朴な疑問:なぜscanf_s()でなきゃいけないんでしょう? scanf()あるいは、fgets()+sscanf()で解決できると思いますが?
guest

回答4

0

arrの直後に入れます。

投稿2019/06/30 06:36

majiponi

総合スコア1720

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

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

0

sscanf_s()でも良いですが、 (そちらの場合、majiponiさんの回答で)

strtok()を使う方法もあります。

C

1#include <stdlib.h> 2#include <string.h> 3.... 4 char *result; 5 6 result = strtok(array, " "); 7 strncpy(arr, result, 10); 8 num1 = atoi(strtok(NULL, " ")); 9 num2 = atoi(strtok(NULL, " "));

strtok()関数については、strtok とかに解説がありますが、二番目の引数で区切り文字を指定し、文字列の分解を行います。
元の文字列を壊すとか、戻り値の NULL確認が必要とかの注意がありますが、参考までに。

投稿2019/06/30 09:58

pepperleaf

総合スコア6383

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

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

0

ベストアンサー

たぶん、こうすればよい。

C

1 fgets(array, sizeof(array), stdin); // scanf_s() では不可 2 printf("array:[%s]\n", array); // デバッグプリント 3 sscanf_s(array, "%s %d %d", arr, sizeof(arr), &num1, &num2); 4 printf("%s %d %d", arr, num1, num2);

fgets() ではなく、gets_s(array, sizeof(array)); でも良いはず。要は、いったん一行全部を array[] に読み込んでしまう、その後でゆっくり分解する。

scanf(), scanf_s() は、入力文字列を空白文字で区切ってしまうのが基本動作なので
"ABC 123 987" とタイプしても array[] には "ABC" しか入力されないと思う。そういうことは** printf デバッグで確かめれば済む**こと。


scanf_s() 等で文字列を入力する場合は、文字列を格納する配列の大きさを指定しなければなりません。配列の名前の次に配列の大きさを指定するので sizeof(arr) を使うなら

C

1 sscanf_s(array, "%s %d %d", arr, sizeof(arr), &num1, &num2);

ケアレスミス・タイポ発見

C

1 printf("&s %d %d", arr, num1, num2); // NG 2 printf("%s %d %d", arr, num1, num2); // OK

投稿2019/06/30 09:54

編集2019/06/30 11:42
rubato6809

総合スコア1380

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

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

Cpro

2019/06/30 10:42

回答ありがとうございました。 コンパイルしてみたんですが、何もせずに終わってしまいました…
Cpro

2019/06/30 12:15

とても勉強になりました。 本当にありがとうございました。
guest

0

array[20]に格納することが必須なんですか?
それとも、分解する方法がわからなくてそうしてる?

arr[10]とnum1,num2にデータを取り込みたいだけなら、

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char arr[10]; 6 int num1; 7 int num2; 8 9 scanf_s("%s%d%d", arr, sizeof(arr), &num1, &num2); 10 11 printf("%s %d %d", arr, num1, num2); 12 13 return 0; 14}

で良いのでは?

scanf系の書式指定%sとか%dは、冒頭のホワイトスペース(空白、水平タブ、改行)を読み飛ばしたあと、指定した書式で取り込めるデータを取り込んで、取り込めない文字(%sならホワイトスペース、%dなら数字以外も)が出てきたらその文字をストリームに戻して次の解釈に進む、あるいは書式指定が終わりなら関数を終わりにします。
書式指定"%s%d"に"ABC 123"を与えたら%sで"ABC"を取り込んでから残りの" 123"を%dで解釈するので空白は飛ばされ、"123"が数値に変換して取り込まれます。つまり、"%s %d"とする必要はありません(したからといって害もないですけど)。

で、ホワイトスペースはどの文字でも同じ働きをします。つまり、空白で区切っても改行で区切っても、scanf系関数の取り込みにおいては同じ処理。上記のプログラムに対してデータを空白で区切って
abc 123 987
と与えても、改行で区切って
abc
123
987
と与えてもも変わらない結果が得られるはずです(改行のエコーバックで入力中の画面表示は変わりますが、変数の値は変わらない)。

ただし、OSがキーボード入力を標準入力に格納するトリガが普通は改行ですから、最後のデータのあとは改行を叩かないといけません。しかしこれはC言語の預かり知らぬところです。

投稿2019/06/30 12:42

thkana

総合スコア7639

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問