는 경우와 평등 문의
-
03-07-2019 - |
문제
나는이 문제를 해결하기 위해 노력하고 기 하지만 내가 왜 나의 코드 작동하지 않습니다.어떤 도움에 감사드립니다.편집:편집 보정을 만들려면 아래에 언급하지만,여전히 추가"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 ...