2

天気データベースのコードを書いていますが、都市と気温を印刷しようとすると、最初の行が1文字ずれているため、理由がわかりません。私が気づいたことの1つは、たとえばprintf( "%20s"、city);を印刷するときです。最初の都市のみが変更されています。

これはCプログラミングの入門書であり、文字列についてはまだあまり学習していません。そのため、私は文字ごとに読みました。

これが私が参照しているコードのスニペットです。

while(TRUE) {
  for(
    i=0; 
    fscanf(input,"%c", &c)!=EOF && c!='#';
    i++)
  {  //i.e. city#..
    city[i]=c;
  }

  if(c=='#') {
    city[i] = '\0';         //Next line scans in the weather for the days of the week
    fscanf(input, " (%f, %f), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d)",&h_avg, &l_avg,&s1,&s2,&m1,&m2,&t1,&t2,&w1,&w2,&th1,&th2,&f1,&f2,&sa1,&sa2);
    printf("%20s  %d %d", city, s1,s2);
  } else {
    printf("\n"); 
    break;
  }  //Break infinite loop because for loop broke from EOF
}

サンプル出力:

           Baltimore 75 60
Miami  20 10
Washington D.C.  75 50
New York  75 50

ボルチモアだけが正しく調整されています。どんな助けでも大歓迎です。

4

1 に答える 1

5

scanfパターンは"%c"空白をスキップしないため、都市の文字列に空白が含まれる可能性があります。特に、前の行の最後にある改行()を超えてスキャンすることはないため\n、都市名はすべて改行で始まります(最初の行を除く)。さらに、printf(都市にあるものを除いて)改行を印刷することは決してないので、それはあなたが見ているものを説明します。

より正確には、2番目の都市は"\nMiami"(6文字)として読み取られるため、で印刷すると"%20s"、最初に14個のスペースが印刷されます。これらのスペースはすべて行の終わりに印刷されBaltimore(行末には改行が印刷されないため)、次に印刷されます。"\nMiami"

使用してみてください:

for (i = 0; fscanf(input,"%c", &c)!=EOF && c!='#';) {
    if (i == 0 && isspace(c)) continue;
    city[i++] = c; }
while (i>0 && isspace(city[i-1])) i--;

都市名から先頭と末尾の空白を削除します。

于 2013-02-19T19:20:11.987 に答える