ページ 1 / 1
fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月07日(月) 21:08
by しん
私は演習課題でサイコロを最大六回まで投げて、そのサイコロの目の和を出したいプログラムを作成しております。
標準入力で以下の数字を入力します
例1
5
3 4 5 2 1
例2
3
2 3 1
上の5はサイコロを投げた回数
下の数字はサイコロを投げた目をfgets()とsscanf()で呼び込みたいです。
下のfor文で一行目のサイコロを投げた回数をn回回して、その合計値をb=b+m;で足し算をしたと考えております。
ここで困っているのが、下の数字のスペース区切りで入力した数字をn回読み込むためにはsscanf()でどのような読み込み方をすればよいでしょうか?
以下私が途中まで作成したコードです。
#include <stdio.h>
int main(void){
char str[1000];
int n;
int m;
int b;
fgets(str, sizeof(str), stdin);
sscanf(str,"%d",&n);
fgets(str,sizeof(str),stdin);
sscanf(str,"%d ",&m);
for(int i =0;i<n;i++){
// m = strtok(NULL," ");
printf("%d\n", m);
b=b+m;
}
printf("%d", b);
return 0;
}
Re: fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月07日(月) 23:39
by みけCAT
書式%nを使うとそこまでに読み込んだバイト数を取得できるので、
これを用いて読み込む位置をずらしていくといいでしょう。
コード:
#include <stdio.h>
int main(void){
char str[1000];
int n;
int m;
int i;
char* p;
fgets(str, sizeof(str), stdin);
sscanf(str, "%d", &n);
fgets(str, sizeof(str), stdin);
p = str;
for (i = 0; i < n; i++) {
int len;
if (sscanf(p, "%d%n", &m, &len) != 1) {
fputs("read error\n", stderr);
return 1;
}
printf("i = %d, m = %d, len = %d\n", i, m, len);
p += len;
}
return 0;
}
Re: fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月08日(火) 00:43
by box
コード:
sscanf(str,"%d",&n);
sscanf(str,"%d ",&m);
&が全角のため、コンパイルできないはずです。
コードを貼るときは、最新版をコピペして、
codeタグと/codeタグにはさんでください。
Re: fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月08日(火) 17:55
by Meta3
#2 をお借りして VisualStudio2019 で実行
コード:
#include <stdio.h>
int main(void){
char str[1000];
int n;
int m;
int i;
int b=0;
char* p;
fgets(str, sizeof(str), stdin);
sscanf(str, "%d", &n);
fgets(str, sizeof(str), stdin);
p = str;
for (i = 0; i < n; i++) {
int len;
if (sscanf(p, "%d%n", &m, &len) != 1) {
fputs("read error\n", stderr);
return 1;
}
printf("i = %d, m = %d, len = %d\n", i, m, len);
p += len;
b += m;
}
printf("m合計= %d", b);
return 0;
}
Re: fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月08日(火) 17:59
by Meta3
コード:
c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.26.28806 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
c1.c
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:c1.exe
c1.obj
c:\b>c1
5
3 4 5 2 1
i = 0, m = 3, len = 1
i = 1, m = 4, len = 2
i = 2, m = 5, len = 2
i = 3, m = 2, len = 2
i = 4, m = 1, len = 2
m合計= 15
c:\b>C
Re: fgetsとsscanfで複数の数字を読み込みたいです。
Posted: 2020年12月10日(木) 20:07
by しん
皆さんアドバイスをありがとうございます。
先ほど#2のソースコードを引用して実行したら、イメージにほとんど近い結果が実行できました。
色々詳しく教えて頂き誠にありがとうございます。