0

我试图在这里解决问题,但我不知道为什么我的代码不起作用。任何帮助表示赞赏。编辑:编辑以进行下面提到的更正,但输出的第二行仍然有一个额外的“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

6

一方面,我认为你的比较是倒退的。例如,您应该测试“if ('A' <= mystr[j] && mystr[j] <= 'C')”。

于 2009-05-04T21:42:37.913 回答
3

问题是您正在遍历输入字符串中的所有 15 个字符,而不管输入的长度如何。第一个测试用例有 11 个字符,但第二个用例只有 8 个。在第二次迭代中,您不小心处理了第一个输入的最后两个字符,即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

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

把你的信放在左边,把它与之比较的东西放在右边。否则它会很快变得非常混乱。

于 2009-05-04T21:48:11.720 回答
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 回答