0

ここで問題を解決しようとしていますが、コードが機能しない理由がわかりません。どんな助けでも大歓迎です。編集:以下で説明する修正を行うために編集されましたが、出力の2行目にまだ余分な「15」(太字)があり、それがどこから来ているのかわかりません。

私の出力は

18662658515 5552272 15

#include <stdlib.h>
#include <stdio.h>

int main(void){
  int n;
  int j;
  scanf("%d\n", &n);
  int i = 0;
  char mystr[15];

  for(;i<n;i++){
    fgets(mystr,15,stdin);

    for(j=0;j<15;j++){
      if(isdigit(mystr[j])){
        printf("%c", mystr[j]);
        continue;
      }
      if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");
      if ('D' <= mystr[j] && mystr[j] <= 'F')
        printf("3");
      if ('G' <= mystr[j] && mystr[j] <= 'I')
        printf("4");
      if ('J' <= mystr[j] && mystr[j] <= 'L')
        printf("5");
      if ('M' <= mystr[j] && mystr[j] <= 'O')
        printf("6");
      if ('P' <= mystr[j] && mystr[j] <= 'S')
        printf("7");
      if ('T' <= mystr[j] && mystr[j] <= 'V')
        printf("8");
      if ('W' <= mystr[j] && mystr[j] <= 'Z')
        printf("9");
    }
    printf("\n");
  }
}
4

5 に答える 5

3

問題は、入力の長さに関係なく、入力文字列の15文字すべてを反復処理していることです。最初のテストケースには11文字が含まれていますが、2番目のケースには8文字しかありません。2回目の反復では、最初の入力の最後の2文字である。を誤って処理してい15ます。

これを修正するには、NUL文字0をヒットしたときに反復を停止します。これにより、この行を変更して文字列が終了します。

for(j=0;j<15;j++){

for(j=0; mystr[j] != 0; j++){
于 2009-05-04T22:03:51.293 に答える
2

関数 between() があると、おそらく役に立ちます (申し訳ありませんが、私の C は錆びています)。

bool between(char c, char before, char after) {
    return before <= c && c <= after;
}

それで

if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");

になる

if (between(mystr[j], 'A', 'C')
        printf("2");

一般的には、下限が包括的で上限が排他的である半開放範囲を使用することをお勧めします。これにより、各テストの最後の要素が前のテストの最初の要素になり、特定の種類のバグをより簡単に検出できるようになります。

于 2009-05-04T21:57:06.707 に答える
1

ルックアップテーブルを使用すると、これは簡単になりませんか?

int numbers[] = {              2, 2, 2,  3, 3, 3,
                     4, 4, 4,  5, 5, 5,  6, 6, 6,
                  7, 7, 7, 7,  8, 8, 8,  9, 9, 9, 9};

... cut ...

if (isdigit (mystr[j]))
    printf ("%c", mystr[j]);
else
    printf ("%d", numbers[mystr[j] - 'A']);

... cut ...
于 2009-05-04T22:04:55.627 に答える
1

物事を同じ順序で比較したい場合があると考えてください。コードを書く前に、これを平易な英語で話してください。myLetterCode が A.code より大きい && myLetterCode が C.Code より小さい場合 (B である必要があります)。

手紙を左側に、比較対象を右側に置きます。そうしないと、混乱が非常に速くなります。

于 2009-05-04T21:48:11.720 に答える