fgetsとsscanfで複数の数字を読み込みたいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しん
記事: 4
登録日時: 4ヶ月前

fgetsとsscanfで複数の数字を読み込みたいです。

#1

投稿記事 by しん » 4ヶ月前

私は演習課題でサイコロを最大六回まで投げて、そのサイコロの目の和を出したいプログラムを作成しております。

標準入力で以下の数字を入力します
例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;
}

アバター
みけCAT
記事: 6397
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: fgetsとsscanfで複数の数字を読み込みたいです。

#2

投稿記事 by みけCAT » 4ヶ月前

書式%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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 1760
登録日時: 10年前

Re: fgetsとsscanfで複数の数字を読み込みたいです。

#3

投稿記事 by box » 4ヶ月前

コード:

sscanf(str,"%d",&n);
sscanf(str,"%d ",&m);
&が全角のため、コンパイルできないはずです。
コードを貼るときは、最新版をコピペして、
codeタグと/codeタグにはさんでください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Meta3

Re: fgetsとsscanfで複数の数字を読み込みたいです。

#4

投稿記事 by Meta3 » 4ヶ月前

#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;
}

Meta3

Re: fgetsとsscanfで複数の数字を読み込みたいです。

#5

投稿記事 by Meta3 » 4ヶ月前

コード:

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


しん
記事: 4
登録日時: 4ヶ月前

Re: fgetsとsscanfで複数の数字を読み込みたいです。

#6

投稿記事 by しん » 4ヶ月前

皆さんアドバイスをありがとうございます。
先ほど#2のソースコードを引用して実行したら、イメージにほとんど近い結果が実行できました。
色々詳しく教えて頂き誠にありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る