문제

나는이 문제를 해결하기 위해 노력하고 하지만 내가 왜 나의 코드 작동하지 않습니다.어떤 도움에 감사드립니다.편집:편집 보정을 만들려면 아래에 언급하지만,여전히 추가"15"(굵은)두 번째 라인에서의 출력하고 내가 이해하지 못하는 곳에서 오고 있다.

내 출력

18662658515 555227215

#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'<= mystr [j] && mystr [j] <= 'c')를 테스트해야합니다.

그것이 도움이 될 것이라고,아마도 기능을 가지 사이에()(사과와 함께;내 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 && 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