2014-03-24 2 views
0

이 함수는 매우 간단하거나 적어도 그렇게해야합니다. 배경 : 체스 프로그램을 만들고 있는데이 함수는 표의 끝에 도달 한 폰에 프로모션 값을 할당하기 위해 실행됩니다. 이는 판촉 요청을 읽는 기능입니다. 탐지 및 실제 프로모션은 하나 fxn 높습니다. 여기에 코드입니다 :이 간단한 함수의 동작에 혼동이 있음

char promote (int player) 
{ 

    char req, out; 
    req = '0'; //shouldn't be necessary, and should be overwritten by scanf 
    out = '0'; //just in case, should be overwritten 
    printf("What piece would you like to promote to? (Q/N/R/B) \n"); 
    scanf("%c", &req); 

    if (req == 'q' || req == 'Q') 
    { 
     out = 'q'; 
    } 
    else if (req == 'r' || req == 'R') 
    { 
     out = 'r'; 
    } 
    else if (req == 'n' || req == 'N') 
    { 
     out = 'n'; 
    } 
    else if (req == 'b' || req == 'B') 
    { 
     out = 'i'; 
    } 
    else if (req != 'q' && req != 'Q' && req != 'r' && req != 'R' && req != 'n' && req != 'N' && req != 'b' && req != 'B') 
    { 
     printf("req: %c, out: %c \n", req, out); //to test variable values 
     printf("That character is invalid. Please enter another.\n"); 
     return promote(player); 
    } //a simple else should suffice here. I put in the else if as a possible fix via redundancy (didn't work) 

    if(player == 2) 
    { 
     out = toupper(out); //designates team by case 
    } 

    printf("Returning %c\n", out); //test out value again 
    return out; 
} 

어떻게해야합니까 : 단일 문자 입력을위한 Fxn 스캔, REQ에 할당, 8 개의 가능한 선택에 대한 REQ를 확인합니다. 네 개의 빈 중 하나에 맞으면 네 개의 값 중 하나를 출력합니다. 그렇지 않다면 간단한 오류 메시지를 출력하고 스캔 할 때마다 자신의 호출을 반환합니다.

어떤 일이 일어나는가 : scanf가 호출되면 \ n (자동)을 읽음과 동시에 즉시 오류를 뱉어냅니다 메시지 및 루프 자체에 대한 입력을 기다리지 않고. 두 번째 루프에서는 잘 작동하지만 한 가지주의해야 할 점이 있습니다. 잘못된 문자를 입력하면 적절한 오류 메시지가 반환되고 다시 호출하면 \ n을 읽는 루프가 반복됩니다. 오류 메시지가 아닌 기능 자체가 비난받을 것을 제안합니다.

출력 :

You can now promote your pawn. What piece would you like to promote to? (Q/N/R/B) 
req: 
, out: 0 
That character is invalid. Please enter another. 
What piece would you like to promote to? (Q/N/R/B) 
q 
Returning q 

어떤 아이디어? 나는 이것을 고치려고 노력하는 12 가지 다른 것들을 시도해 봤고, 그들 중 누구도 일하지 않았다. 아마 내 모든 큰 실수들처럼 단순 할거야. 어떤 도움을 주셔서 감사합니다!

답변

0

scanf은 아마도 이전 입력에서 줄 바꿈을 읽는 것 같습니다. 이 문제를 해결하려면, 당신은 단순히 루프 scanf 때까지 공백없는 뭔가 얻을 수 있습니다 : 여담으로

do { 
    scanf("%c", &req); 
} while(isspace(req)); 

을, 당신은 당신의 req 테스트를 단순화해야하는, 소문자로 문자를 변환 할 tolower를 사용할 수 있습니다.

+0

그래, 그게 효과가 있었는지 모르겠지만 입력이 섞여서. 이것은 일반적인 문제입니까? 그리고 tolower에 대한 좋은 호응은 테스트를 단순화하기 위해 그것을 사용하는 것에 대해서 생각조차하지 않았습니다! – Dasbooten

+0

@Dasbooten : 아마 이전 입력이지만, 전체 콘솔 로그를 표시하지 않았기 때문에 어느 것을 말할 수 없습니다. – nneonneo

+0

이전 입력은 하나뿐입니다. scanf ("% s % s % s", move.loc1, move.to, move.loc2); 그 다음에 printf ("\ n");가 있어야합니다. 수정 사항이 있습니까? – Dasbooten

관련 문제