質問

問題を解決しようとしていますこちらしかし、なぜコードが機能しないのか分かりません。どんな助けも大歓迎です。編集:下記の修正を行うために編集されましたが、まだ余分な<!> quot; 15 <!> quot;があります。 (太字で)出力の2行目で、どこから来たのかわかりません。

私の出力は

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");
  }
}
役に立ちましたか?

解決

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

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

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

to

for(j=0; mystr[j] != 0; j++){

他のヒント

一つには、あなたの比較は後方にあると思います。たとえば、<!> quot; if( 'A' <!> lt; = mystr [j] <!> amp; <!> amp; mystr [j] <!> lt; = 'C' )<!> quot;。

おそらく、関数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");

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

同じ順番で物事を比較したいと思うかもしれません。コードを書く前に、これを平易な英語で話してください。 myLetterCodeがA.codeよりも大きい場合<!> amp; <!> amp; myLetterCodeはC.Codeよりも小さい(Bでなければならない!)。

左側にあなたの手紙を、右側にあなたがそれを比較しているものを保管してください。そうしないと、非常に速く非常に混乱します。

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

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 ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top