이 함수는 매우 간단하거나 적어도 그렇게해야합니다. 배경 : 체스 프로그램을 만들고 있는데이 함수는 표의 끝에 도달 한 폰에 프로모션 값을 할당하기 위해 실행됩니다. 이는 판촉 요청을 읽는 기능입니다. 탐지 및 실제 프로모션은 하나 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 가지 다른 것들을 시도해 봤고, 그들 중 누구도 일하지 않았다. 아마 내 모든 큰 실수들처럼 단순 할거야. 어떤 도움을 주셔서 감사합니다!
그래, 그게 효과가 있었는지 모르겠지만 입력이 섞여서. 이것은 일반적인 문제입니까? 그리고 tolower에 대한 좋은 호응은 테스트를 단순화하기 위해 그것을 사용하는 것에 대해서 생각조차하지 않았습니다! – Dasbooten
@Dasbooten : 아마 이전 입력이지만, 전체 콘솔 로그를 표시하지 않았기 때문에 어느 것을 말할 수 없습니다. – nneonneo
이전 입력은 하나뿐입니다. scanf ("% s % s % s", move.loc1, move.to, move.loc2); 그 다음에 printf ("\ n");가 있어야합니다. 수정 사항이 있습니까? – Dasbooten