반응형
📌 C 언어 입출력 정리
1. 표준 입력 (Standard Input)
기능 | 함수 |
정수 입력 | scanf("%d", &a); |
실수 입력 | scanf("%f", &b); |
문자 입력 | getchar(); |
문자열 입력 (BOF 위험 있음) | gets(str); |
문자열 입력 (글자수를 지정해야함) | fgets(str, sizeof(str), stdin); |
2. 표준 출력 (Standard Output)
기능 | 함수 |
정수 출력 | printf("%d", a); |
실수 출력 | printf("%.2f", b); |
문자 출력 | putchar(ch); |
문자열 출력 | puts(str); |
1. printf
> 기본 문법
#include <stdio.h>
int main() {
int num = 10;
printf("출력 값: %d\n", num);
return 0;
}
> 포멧 지정자
포맷 지정자 | 설명 | 예제 |
%d | 정수(int) | printf("%d", 10); |
%ld | 긴 정수(long) | printf("%ld", 1234567890L); |
%u | 부호 없는 정수(unsigned int) | printf("%u", 3000000000U); |
%f | 부동 소수점(float) | printf("%f", 3.14f); |
%lf | 부동 소수점(double) | printf("%lf", 3.1415926535); |
%e | 지수 표기법(float, double) | printf("%e", 3.14e-10); |
%g | 자동 지수/고정 소수점 선택 | printf("%g", 3.14); |
%c | 문자(char) | printf("%c", 'A'); |
%s | 문자열(char 배열) | printf("%s", "Hello"); |
%p | 포인터 주소 | printf("%p", (void*)&num); |
%x | 16진수(hexadecimal, 소문자) | printf("%x", 255); // ff |
%X | 16진수(hexadecimal, 대문자) | printf("%X", 255); // FF |
%o | 8진수(octal) | printf("%o", 255); // 377 |
※ 소수점 자리수 지정
printf에서는 %.nf 또는 %.nlf 형식을 사용하여 소수점 아래 n자리까지 출력
#include <stdio.h>
int main() {
double num = 3.1415926535;
printf("%.1f\n", num); // 소수점 1자리
printf("%.2f\n", num); // 소수점 2자리
printf("%.5f\n", num); // 소수점 5자리
printf("%.10f\n", num); // 소수점 10자리
printf("%8.2f\n", num); // 최소 8칸 확보, 소수점 2자리
printf("%08.2f\n", num); // 앞을 0으로 채움 (패딩)
/* 출력결과
3.14
00003.14
*/
return 0;
}
2. scanf
> 기본 문법
#include <stdio.h>
int main() {
//기본(1개) 입력
int num;
scanf("%d", &num); // %d : 포맷 지정자, &num : 값을 저장할 메모리 주소
printf("입력된 값: %d\n", num);
//여러 개 입력
int a, b;
scanf("%d %d", &a, &b);
printf("입력된 값: %d, %d\n", a, b);
return 0;
}
> 포맷 지정자
포맷 지정자 | 설명 | 예제 |
%d | 정수(int) | scanf("%d", &a); |
%ld | 긴 정수(long) | scanf("%ld", &a); |
%f | 부동 소수점(float) | scanf("%f", &a); |
%lf | 부동 소수점(double) | scanf("%lf", &a); |
%c | 문자(char) | scanf("%c", &a); |
%s | 문자열(char 배열) | scanf("%s", str); |
%u | 부호 없는 정수(unsigned int) | scanf("%u", &a); |
%x | 16진수 입력 | scanf("%x", &a); |
> 주의 사항 !!!!
1. scanf는 공백(공백 문자, 개행 문자)을 자동으로 무시하지 않음(%c로 문자 입력을 받을 경우 특히 주의)
→ scanf(" %c", &ch); 처럼 앞에 공백을 추가하여 해결할 수 있음.
→ 공백이 포함된 문자열을 받을 거라면, fgets를 이용하자
2. scanf는 입력 길이 제한 없음.
→ 배열의 크기를 초과할 경우 버퍼 오버플로우가 발생할 수 있음
#include <stdio.h>
int main() {
char str[5]; // 5개 크기 배열
scanf("%4s", str); // [4자 입력 제한 + '\n'] (총 5자) 오버플로우 방지
printf("입력된 문자열: %s\n", str);
return 0;
}
3. 정수와 문자열이 함께 섞여있을때
#include <stdio.h>
int main() {
int age;
char name[50];
printf("나이 입력: ");
scanf("%d", &age);
getchar(); // 개행 문자 제거
printf("이름 입력: ");
fgets(name, sizeof(name), stdin);
printf("이름: %s나이: %d\n", name, age);
return 0;
}
3. gets
> 기본 문법
#include <stdio.h>
int main() {
char str[50];
printf("문자열 입력: ");
gets(str); // 버퍼 오버플로우 위험
printf("입력된 문자열: %s\n", str);
return 0;
}
- 입력 길이 제한이 없음 → 버퍼 오버플로우 발생 가능
- 보안에 취약하여 C11 이후 표준에서 제거됨
- 대체 방법: fgets를 사용할 것!
4. fgets
> 기본 문법
#include <stdio.h>
int main() {
char str[50];
printf("문자열 입력: ");
fgets(str, sizeof(str), stdin); // 최대 (sizeof(str) - 1)개 문자 입력 가능
printf("입력된 문자열: %s", str);
return 0;
}
- 공백 포함 문자열 입력 가능 → scanf("%s", str);는 공백을 기준으로 입력을 끊지만, fgets는 공백 포함 가능
- 버퍼 오버플로우 방지 → 지정한 크기만큼만 입력을 받음
- 개행 문자(\n) 포함 → Enter(개행 문자)까지 포함하여 입력받음
→ 필요하면 수동으로 str[strcspn(str, "\n")] = '\0';을 사용하여 개행 제거
반응형
'SW개발 > 갑자기 C코테를 봐야할때' 카테고리의 다른 글
2. 정렬( qsort() ) (0) | 2025.02.04 |
---|