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

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

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

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

Q&A

解決済

3回答

693閲覧

C言語で数字を読み込んで配列に代入したいのですがどうすればいいか困っています。

kikik

総合スコア24

C

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

0グッド

0クリップ

投稿2022/09/19 08:32

前提

入力↓

3 3 4 5

2行で書かれてあり、1行目の数字は2行目の要素の数

該当のソースコード

c

1#include <stdio.h> 2int main(void){ 3 int i, n; 4 char buf[1000]; 5 char token[3][100]; 6 7 fgets(buf, sizeof(buf), stdin); 8 sscanf(buf, "%d\n", &n); 9 fgets(buf, sizeof(buf), stdin); 10 for (i=0; i<n; i++) { 11 12 sscanf(buf, "%s \n", token[i]); 13 } 14 printf("[0] = %s , [1] = %s ,[2] = %s \n" ,token[0] ,token[1],token[2]); 15 return 0; 16}

実現したいこと

1行目を
fgets()とsscanf()で読んだ後2行目の要素を配列に順番に代入していきたい
理想↓

[0] = 3 , [1] = 4 ,[2] = 5

発生している問題

sscanf()だと1つ目の要素しか読めない

[0] = 3 , [1] = 3 ,[2] = 3

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

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

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

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

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

thkana

2022/09/19 09:15

特に悩む話でもなくscanfを回数分繰り返して拾えばいいと思うのですが、scanfが嫌いだ、とかそういう理由でもあるのでしょうか?
kikik

2022/09/19 10:07

特にないです。 書いてなかったのですが、scanfで実行して文字化けになりできないと思い込んでいたのですが、できることがわかって確認してみたら変数の型が間違っていました。解決しました。
guest

回答3

0

自己解決

質問コーナーにある通りです。

投稿2022/09/19 10:10

kikik

総合スコア24

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

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

0

当たり前かと。

まずコードを読みましょう。コードを読むコツは一行レベルで、その行が何をしているか考えながら読むです。

C

1#include <stdio.h> 2int main(void){ 3 // 変数宣言部 4 int i, n; 5 char buf[1000]; 6 char token[3][100]; 7 8 // コンソールから一行読み込む 9 fgets(buf, sizeof(buf), stdin); 10 // 整数に変換する 11 sscanf(buf, "%d\n", &n); 12 // コンソールから二行目を読み込む 13 fgets(buf, sizeof(buf), stdin); 14 // 以下をn回繰り返す 15 for (i=0; i<n; i++) { 16 // 整数に変換する 17 sscanf(buf, "%s \n", token[i]); 18 } 19 // 結果を表示する 20 printf("[0] = %s , [1] = %s ,[2] = %s \n" ,token[0] ,token[1],token[2]); 21 return 0; 22}

これを疑似コードにしてみる。

0. 変数宣言 1. コンソールから一行読み込む 2. (1)を整数に変換する 3. コンソールから二行目を読み込む 4. 以下をn回繰り返す( n = (2) ) 4.1. (3)の文字列を 半角スペースまでのデータを整数に変換する 5. 取得したデータを出力する

この疑似コードを使ってシミュレーションしてみる。実際にデータを入れて計算してみましょう。

入力値は

3 3 4 5

だとすると、(1)で「"3"」が入力されていますから、(2)でそれを整数に変換する。
すると n = 3 となるはずです。
(3)で読み込まれてbuf = "3 4 5" となりますね。
ここまではいいです。

そして(4)で「n回繰り返す」なので n = 3 、つまり 3回繰り返すことになる。
でも(4.1)では「bufを半角スペースまでのデータを整数に変換する」ですが、bufの値って何でしょうか?
buf = "3 4 5" だったはずです。
では、(4)~(4.1)をやってみましょう。

"3 4 5" の 半角スペースまでを一つの整数として取得すると 3が取り出せますね。
そして(4)に戻って条件式が満たされているかどうか試して二回目を行う。
(4.1)に行って、"3 4 5" で 半角スペースまでを一つの整数として取得する。
そうするとやっぱり3が取り出されますね。
三回目も同じようになる。
そうなるとやっぱり { 3, 3, 3 } となってしまいますね。

(4.1)で処理するときに「先頭から見ている」ためやはりどうしても最初の3しか取り出せませんね。
現実世界で"3 4 5" みたいな数列を見たとき同じような処理をするならどうしますか?

私ならまず一つ目の3を読んで、3のところに斜線なりを引いてチェック済みであることを示し、「半角スペースの次から見る」と思います。それを実装すればいいかと。

投稿2022/09/19 10:05

BeatStar

総合スコア4958

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

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

退会済みユーザー

退会済みユーザー

2022/09/19 10:10

Pseudocodeに日本語が含まれてる
退会済みユーザー

退会済みユーザー

2022/09/19 13:02

ok
guest

0

input N for 1≦i≦N input A[i] output N for 1≦i≦N output A[i]

投稿2022/09/19 09:31

編集2022/09/19 09:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

thkana

2022/09/19 09:43

それはC言語ではないですね...
退会済みユーザー

退会済みユーザー

2022/09/19 09:45

疑似言語
jimbe

2022/09/19 10:03

意味があるのでしょうか。
退会済みユーザー

退会済みユーザー

2022/09/19 10:09

ある
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問