
0 ~ 127 사이 정수 값인 아스키 코드 값으로 바뀜'A' -> 65, 'a' -> 97'a'와 정수 97은 같은 데이터%c, %d)에 따라 출력 형태가 결정됨printf("%d\n", 'a'); // 97
printf("%d\n", 97); // 97
printf("%c\n", 'a'); // a
printf("%c\n", 97); // a
65(A) ~ 90(Z), 소문자는 97(a) ~ 122(z)의 연속된 아스키 코드 값을 가짐char change(char letter){
char gap = 'a' - 'A'; // 대소문자의 차이는 32
if ('a' <= letter && letter <= 'z'){
// 소문자인 경우
return letter - gap;
} else{
// 대문자인 경우
return letter + gap;
}
}
int main(void){
// 소문자 -> 대문자
char small = 'l';
char large = 'G';
printf("%c를 대문자로 바꾸면 %c\n", small, change(small));
printf("%c를 소문자로 바꾸면 %c\n", large, change(large));
// l를 대문자로 바꾸면 L
// G를 소문자로 바꾸면 g
return 0;
}
0과 127 사이 범위를 가지므로, 1바이트 크기의 char형 변수에 저장할 수 있음32로 일정'a' - 'A' (32)를 더하거나 빼면서 대소문자를 변환할 수 있음scanf 함수scanf로 문자를 입력받을 수 있음' '), 탭 문자('\t'), 개행 문자('\n')도 입력받을 수 있음%d, %lf, %s로 입력받을 땐 데이터를 구분하는 용도로 쓰이지만,scanf("%d%d") 꼴에서 10 20과 같이 입력%c에서는 실제 문자열로 입력된다는 점을 주의할 것char ch1, ch2;
scanf("%c%c", &ch1, &ch2);
printf("입력 문자: %c%c, ", ch1, ch2);
printf("입력 문자 아스키코드: [%d][%d]\n", ch1, ch2);
return 0;
// a와 b를 입력하고 Enter
// 입력 문자: ab, 아스키코드: [97][98]
// a와 공백(스페이스바)를 입력하고 Enter
// 입력 문자: a , 아스키코드: [97][32]
%c %c와 같이 각 문자 앞에 공백을 추가char ch1, ch2;
scanf(" %c %c", &ch1, &ch2);
printf("입력 문자: %c%c, ", ch1, ch2);
printf("입력 문자 아스키코드: [%d][%d]\n", ch1, ch2);
return 0;
// 스페이스바 -> a -> 스페이스바 -> b를 입력하고 Enter
// 입력 문자: ab, 입력 문자 아스키코드: [97][98]
scanf는 입력받은 데이터 수를 int형으로 반환char ch1, ch2;
int num = scanf(" %c %c", &ch1, &ch2);
printf("입력 데이터 수: %d", num);
// [입력] 5 10
// [출력] 입력 데이터 수: 2
char ch1;
int result = scanf("%c", &ch1);
printf("%d", result);
return 0;
// [입력] Ctrl+Z -> Enter -> Ctrl+Z -> Enter
// [출력] -1
scanf 사용 중 Ctrl + Z -> Enter -> Ctrl + Z -> Enter을 누르면 -1 반환 (Win11 기준)fgetc, fputcstdin은 키보드로 입력, stdout은 모니터로 출력한다는 뜻이라는 것만 알아두기int fgetc(stdin);: 입력한 문자를 int형으로 반환int fputc(int 입력문자, stdout): int형의 입력문자를 출력 및 반환-1 반환int ch; // 입력 문자 저장 변수
printf("문자를 입력하세요: ");
ch = fgetc(stdin); // fgetc는 입력한 문자를 반환
printf("입력한 문자: ");
fputc(ch, stdout); // fputc는 인수로 받은 문자를 출력
fputc('\n', stdout);
// [입력] 문자를 입력하세요: a
// [출력] 입력한 문자: a
fgetc는 char형이 아니라 int형을 이용해 입력 문자의 아스키코드를 반환Ctrl + Z -> Enter -> Ctrl + Z -> Enter을 누르면 -1 반환fputc엔 int형 외 char형의 입력문자도 출력 가능int 값의 하위 1바이트이기 때문char형도 문제 없이 출력 가능🤔 fgetc, fputc를 printf, scanf 대신 쓸 이유가 있나요? 어차피 기능은 같잖아요?
scanf는 입력값을 형식에 맞게 해석하는 과정에서, printf는 형식에 맞춰 값을 출력하는 과정에서, 추가 연산 및 내부 함수 호출이 이루어집니다.fgetc, fputc는 단순히 한 문자만 입출력하기 때문에 소폭 더 빠르다고 합니다.scanf는 입력받은 데이터의 수를, fgetc가 입력한 문자열의 아스키코드를 반환한다는 차이가 있습니다.Ctrl + Z -> Enter -> Ctrl + Z -> Enter을 누르면 -1을 반환하는 건 똑같습니다.scanf 함수를 통해 변수에 입력됨char ch; // 임시로 문자를 저장
for (int i = 0; i < 4; i++){
scanf("%c", &ch); // 버퍼의 문자를 ch에 저장
printf("%c", ch); // ch에 저장된 문자를 출력
}
// [입력] abc
// [출력 (아랫 줄은 개행문자로 인한 빈칸)]
// abc
//

scanf가 호출되었을 때, 키보드 입력 후 abc\n 전체 문자열이 버퍼에 저장됨\n까지 버퍼에 저장됨에 유의a만 변수 ch에 저장됨scanf 호출부턴 버퍼의 남은 문자열에서 문자를 가져옴b, c를 변수에 저장⚠️ 실제로 각 문자는 버퍼에 아스키 코드(혹은 유니코드)를 비롯한 비트열 형태로 저장됩니다.

scanf가 숫자를 입력받는 경우, 일단 버퍼에 문자열의 형태로 저장됨'2', '0'이 아스키 코드 형태로 저장됨scanf("%d") 꼴scanf 함수가 여러 번 호출될 때, 같은 버퍼를 사용함scanf 함수가 버퍼에 남긴 데이터를, 이후 scanf가 잘못 가져갈 가능성이 있음int num, grade;
printf("학번 입력: ");
scanf("%d", &num);
printf("학점 입력: ");
scanf("%c", &grade);
printf("학번: %d, 학점: %c", num, grade);
// [실행결과 (마지막 줄은 개행 문자로 인한 줄바꿈)]
// 학번 입력: 12213
// 학점 입력: 학번: 12213, 학점:
//

scanf에서 12213을 입력하고 Enter를 누르면, 버퍼엔 12213\n이 저장됨12213은 정수로 변환돼 변수 num에 저장되지만, \n은 버퍼에 남아 있음scanf 호출 시 버퍼에 남아 있는 '\n'이 변수 grade에 저장됨scanf("%c", ...)는 '\n' 같은 화이트스페이스도 저장한다는 점을 기억하기grade를 출력할 땐 개행 문자로 인한 줄바꿈만 출력됨int num, grade;
printf("학번 입력: ");
scanf("%d", &num);
printf("학점 입력: ");
scanf("%c"); // 개행 문자를 제거
scanf("%c", &grade);
printf("학번: %d, 학점: %c", num, grade);
// [실행결과 (마지막 줄은 개행 문자로 인한 줄바꿈)]
// 학번 입력: 12213
// 학점 입력: A
// 학번: 12213, 학점: A

scanf 함수를 추가 호출 해, 버퍼에 남아 있는 개행 문자를 제거해야 함scanf 사용 시 저장할 주소를 명시하지 않으면 단순 제거 가능while (fgetc(stdin) != '\n'){
// 안에 아무것도 없어도 됨
}
fgetc도 scanf와 동일하게 버퍼에서 문자를 하나씩 읽음fgetc는 입력된 문자를 반환\n을 반환할 때까지 함수 실행을 반복하면,키보드로 입력한 단어 중에서 길이가 가장 긴 단어의 길이를 출력합니다. 한 줄에 하나의 단어만 입력하며
Ctrl + Z를 누를 대까지 입력한 단어 중에서 길이가 가장 긴 단어의 길이를 출력합니다. 배열은 사용하지 않고 출력합니다.
Ctrl + Z로 종료되면 fgetc(stdin)은 -1을 반환-1을 반환할 때까지 while문 실행fgetc(stdin)가 입력한 문자를 반환한다는 점을 사용해서'\n'을 반환할 때마다 단어가 끝났으니, 길이 수와 현재 최대 길이를 비교!#include <stdio.h>
int main(void){
char letter; // 현재 문자를 담는 변수
int length = 0; // 현재 단어의 길이
int maxLength = 0; // 우리가 찾는, 길이가 가장 긴 단어의 길이
// Ctrl+Z 콤보로 입력 종료할 때까지 문자 입력
while ((letter = fgetc(stdin)) != -1){
if (letter == '\n'){
if (length > maxLength) maxLength = length;
length = 0;
} else {
length++;
}
}
printf("가장 긴 단어의 길이: %d\n", maxLength);
// 가장 긴 단어의 길이: 10
}