我正在尝试解决问题此处但我不知道为什么我的代码不起作用。任何帮助表示赞赏。编辑:编辑进行下面提到的修正,但还有一个额外的<!> 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");
  }
}
有帮助吗?

解决方案

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

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

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

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

其他提示

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

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