#include <stdio.h>
int ConvCase(int ch)
{
int diff='a'-'A';
if(ch>='A' && ch<='Z')
return ch+diff;
else if(ch>='a' && ch<='z')
return ch-diff;
else
return -1;
}
int main(void)
{
int ch;
printf("문자입력: ");
ch=getchar();
ch=ConvCase(ch);
if(ch==-1)
{
puts("범위를 벗어난 입력입니다.");
return -1;
}
putchar(ch);
return 0;
}
여기서 ConvCase 함수가 이해가안가는데
저함수좀 자세하게 설명좀 해주세요... ㅠ
대소문자 바꾸는 거네요
그러니간 저게 왜 대소문자로 바뀌는 함수인지가 이해가안가요...
알파벳의 아스키 코드는 대문자 Z 다음에 바로 소문자 a가 시작한다. 아스키 코드를 알면 이해가 된다.
아스키 코드를 이용한 변환
int diff='a'-'A'; //아스키 코드 if(ch>='A' && ch<='Z') //아스키코드 값 조건 return ch+diff; //diff에 저장된 아스키코드와 ch 더해서 리턴 else if(ch>='a' && ch<='z') //소문자 아스키 코드 return ch-diff; //리턴
알파벳을 아스키 코드 값으로 보고, 대문자 다음에 소문자가 시작한다는 걸 이용해서, 소문자와 대문자 코드 값의 차이만큼을 더하고 빼서 숫자를 높이고 줄여서 변수에 저장했다. 그 변수를 문자로 출력하니까 알파벳 대소가 바뀌었다.
int diff='a'-'A' 는 소문자a부터 대문자A 사이를 가리키는거에요? 'a' - 'A'
ch+diff;, ch-diff; 이것들도 어떻게 해석하면 되는거에요?
그니까 ASCII 코드가 있는데 a는 코드 값이 100 이면 A는 코드 값이 100-26 이라는 겁니다. 그리고 if문은 코드값으로 받아들여서 크기에 따른 처리를 하고 있습니다. diff는 26인데 아시겠죠?
'a' - 'A'는 아스키 소문자 a에서 대문자 아스키 A 뺀 걸 저장한 겁니다.
알파벳이 우리가 보기에는 알파벳이지만 컴퓨터가 보기에는 숫자에 불과합니다. 이 숫자는 ASCII 코드로 쓰는데 이 코드 문자 대조표를 보고 컴퓨터가 출력해 주는 겁니다.
ch+diff는 ch와 a~A까지 빼놓은 값을 합치면 대문자 전환, 빼면 소문자 전환... a~z 다음 A~Z 니까..
그러니 출력하기 전까지 문자 상수는 이진수와 같죠. 이진수니까 더하고 빼고 연산이 가능합니다. 이진수 값이 바뀌면 컴퓨터는 그 숫자를 다시 코드표를 보면서 이 숫자면 이 문자를 출력하면 되는구나 하고 출력을 해줍니다.
그걸 사용자가 교묘히 이용해서 만들어낸 프로그램으로써 완전히 다른 코드(아스키나 유니코드가 아닌) 를 사용하는 컴퓨터의 경우에는 저 프로그램이 정상적으로 돌아가지 않습니다.
아스키코드가 뭔지 모르는거같은데.. 책 다시 보고 오시는게