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

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

ただいまの
回答率

88.91%

scanfでのデータ入力について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,336

suimin

score 7

前提・実現したいこと

固定された入力方法からデータを配列に代入したい
(a[][]には数字を、A[]には文字を入れたい)

発生している問題・エラーメッセージ

入力に
30
a 1 23 60 78 90
c 0 78 93 32 50

といった数字と文字を半角スペースと改行で区切ったデータをscanfで読み取りたいのですがprintfで出力してもaの配列に0しか入っていません。

該当のソースコード

#include<stdio.h>
 int N,i,j,sum=0;
 char A[50]={};
 int a[50][7]={0};

 scanf("%d",&N);

 for(i=0;i<N;i++){
    //if(i!=0)scanf("\n");
    scanf("%c",A[i]);

    for(j=0;j<5;j++){
        scanf("%d",&a[i][j]);
        printf("%d",a[i][j]);
    }
}

試したこと

改行分は自分でscanfしなければいけないのかと思い//でコメントアウトした部分を追加してみたのですがかありませんでした

詳細

printfは確認用に打ち込みました

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

改行読み飛ばしの指定に誤りがあります。
i==0のときも\nを読み飛ばさないと、%cの後にアルファベットが残ったままになります。だから直後の%dで読み込めないのです。

蛇足:scanfの使用方法に誤りがあります。
読み込み用変数は、アドレスを指定する必要があります。つまり、A[i]ではなく、&A[i]と指定しなければいけません。
アドレスに0を指定しており、クラッシュしてもおかしくないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/22 22:54

    ご回答ありがとうございます
    ”%cの後にアルファベットが残ったままになります”とありますが、この場合、改行文字を%cが読み取っているという判断でよろしいのでしょうか?

    キャンセル

  • 2017/04/23 09:10

    Exactly. (その通りでございます。)
    最初の30を読み込むとき、改行を入力しますよね? "%c"だと、その改行コードを読み込んでしまうのです。
    " %c"とすると、空白文字類(改行コードを含む)を読み飛ばして次のアルファベットを読み込みます。これは%c特有の仕様です。

    キャンセル

  • 2017/04/23 20:06

    なるほど ありがとうございます!
    scanfについての問題は解決できました

    キャンセル

0

例えばですがこんな様でしょうか

#include<stdio.h>
int a[50][7]={0};
int N,i,j,sum=0;
char A[50]={};

int main(char **args) {
    scanf("%d",&N);
    for(i=0;i<N;i++){
        scanf(" %c%d%d%d%d%d",&A[i],
        &a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
    }
    for (i=0;i<N;i++){
        printf("%c",A[i]);
        for(j=0;j<5;j++){
            printf(" %d",a[i][j]);
        }
        printf("\n");
   }
}


sumは??

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/22 22:51

    回答ありがとうございます
    問題は解決したのですが未だに理解が追いついていないのが現状です。
    scanf(" %c%d%d%d%d%d")の部分なのですが、%cの前に半角スペースを入れるか入れないかによって値が変わっていました...このような違いが起きる理由がよくわかっておらず、もしお時間あればご返信いただけると幸いです。

    キャンセル

  • 2017/04/23 07:02

    改行文字('\n')が残るためです。scanf関数では,正しく入力しても最後の改行は入力バッファに残るため,%c指定をした場合,おかしな動作になります。 これを回避する方法として" %c"で空白を読み飛ばします。
    または、scanf("%c%c%d%d%d%d%d",&M,&A[i],・・・としても行けると。(最初のMで改行を捨てる)

    キャンセル

  • 2017/04/23 20:07

    理解できました!具体的なコードの訂正まで示していただいてありがとうございます

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る