如果和平等声明

时间:2009-05-04 21:38:12

标签: c if-statement conditional-statements equality

我正在尝试解决问题here,但我不知道为什么我的代码无效。任何帮助表示赞赏。编辑:编辑进行下面提到的修正,但在输出的第二行还有一个额外的“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");
  }
}

5 个答案:

答案 0 :(得分:6)

首先,我认为你的比较是倒退的。例如,您应该测试“if('A'&lt; = mystr [j]&amp;&amp; mystr [j]&lt; ='C')”。

答案 1 :(得分:3)

问题在于,无论输入的长度如何,您都在迭代输入字符串中的所有15个字符。第一个测试用例有11个字符,但第二个测试用例只有8个。在第二个迭代中,你不小心处理了第一个输入的最后两个字符,即15

要修复它,只需在点击NUL字符0时停止迭代,通过更改此行来终止字符串

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

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

答案 2 :(得分:2)

或许,在()之间有一个函数会有帮助(道歉;我的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");

通常最好使用半开放范围,其中下限是包含的,上限是独占的。这样,每个测试的最后一个元素将是前一个测试的第一个元素,它可以帮助您更容易地检测某些类型的错误。

答案 3 :(得分:1)

考虑您可能希望以相同的顺序比较事物。在编写代码之前用简单的英语说出来。如果myLetterCode大于A.code&amp;&amp; myLetterCode小于C.Code(必须是B!)。

将您的信件保留在左侧,将您正在比较的信息放在右侧。否则它会非常快速地混乱。

答案 4 :(得分: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 ...