scanf

後輩の質問を受けた。

中1は基本的にC言語Javaの勉強をしていて、AOJ解けって言ってた。

「AOJのVolume5の501がわかりません」

要は、文字列を変換するリストと、文字列が与えられるので変換後の文字列を出力しろと(nの上限決まってなかったりで疑問なんだが)。

んで、その中1はちゃんと自分の書いたソース載せてたのでちょっと書き加えた。

#include <stdio.h>

int main()
{
  int n,m,i,j;
  char a[1000],b[1000];
  while(1){
    scanf("%d",&n);
    if(n == 0)return 0;
    for(i = 0;i < n;i++){
      scanf(" %c %c", &a[i], &b[i]);
    }
    scanf("%d", &m);
    for(i = 0;i < m;i++){
      char c;
      scanf(" %c",&c);
      for(j = 0;j < n;j++){
        if(c == a[j]){
            c = b[j];
            break;
        }
      }
      printf("%c",c);
    }
    puts("");
  }
}

ハマったのがscanf。

はじめ、

scanf("%d", &n);

scanf("%c",&c[i]);

という風にしていたんだけれども、

アウトプットミスってるし

入力待ちがどうも想定してるインプットより少ないのでおかしいと思った。

出力よく見てると改行されてるので、scanf("%c\n",&c[i])にした。

すると、アウトプットは正しくなったが、逆にインプットを多く求められた。

 

結構ハマったあげく、調べてみるとこういうふうにあった。

http://www.pc.uec.ac.jp/sp/hshrkw/edu/program/b1/Ex2-1b.htm
初歩的なことなんだけど忘れてるとハマる。

結局、scanf(" %c",&c[i])にすることでうまく動いた。

気をつけよう(戒め)