-
3. 출력정리노트/C언어 정리노트 2025. 1. 16. 23:45반응형
입력과 출력은 프로그래밍에서 가장 기초적인 부분이다. 입력된 정보를 바탕으로, 정보를 처리하여 데이터를 출력하는 방식으로 대부분의 프로그램이 작동한다.
C언어에도 출력이 존재한다. 앞서 설명한 printf() 함수이다.
기초적인 사용법
printf() 함수의 사용법은 다음과 같다.
printf("Hello World!");
printf() 함수 안에 큰따옴표로 감싼 문자열을 넣는 방식으로 원하는 문자열을 출력할 수 있다.
예시 문제 - 정올 #101
정보 올림피아드 사이트의 문제 중 출력 문제를 예시로 활용법을 알아보자.
문제
다음 "출력 예"와 같이 출력하는 프로그램을 작성하시오.
예제
입력 입력은 없다. 출력 My name is Hong
위 문제는 My name is Hong 이라는 문자열을 출력하는 것이 목표인 문제이다. printf("My name is Hong") 을 사용하면 해결할 수 있는 간단한 문제이다.
정답 코드
#include <stdio.h> int main() { printf("My name is Hong"); return 0; }
위와 같이 printf() 문을 사용할 수 있다.
여러 줄 출력하기
printf() 함수를 활용하여 여러 줄 출력을 해 보자.
Hello World! It's a beautiful night
위와 같이 출력하기 위해 printf() 함수를 사용하였다.
#include <stdio.h> int main() { printf("Hello World!"); printf("It's a beautiful night"); return 0; }
단순히 printf() 를 두 번 호출하면 두 줄이 생기지 않을까? 하는 생각에서 함수를 두 번 사용했지만, 실제 출력은 생각과 다르다.
Hello World!It's a beautiful night
보는 것과 같이, 줄이 바뀌지 않는 것을 알 수 있다.
파이썬의 print()와 다르게, C언어의 printf()는 뒤에 줄바꿈이 포함되지 않는다.
C에서 줄바꿈을 위해서는, "\n" 이라는 이스케이프 시퀀스를 사용해야 한다.
n은 New line을 의미한다.
#include <stdio.h> int main() { printf("Hello World!\n"); printf("It's a beautiful night"); return 0; } // output : Hello World! // It's a beautiful night
위와 같은 방법을 사용하여 문제를 해결할 수 있다.
printf()를 한 번만 사용하고도 문제를 해결할 수 있는데,
printf("Hello World!\nIt's a beautiful night");
와 같이 \n 뒤에 다음 줄의 내용을 입력해 두면 같은 결과를 낼 수 있다. 단 가독성이 떨어질 수 있다는 것이 단점.
변수 출력하기
프로그램 중에는 변수를 출력해야 하는 문제도 다수 있다. 이런 경우에는 어떻게 출력해야 할까?
단순히 생각해 보았을 때,
int a = 1; printf(a)
와 같은 방식으로 작동시킬 수 있을 것 같지만 실제로 위의 코드를 실행했을 때에 오류가 발생하게 된다.
그렇다면 어떻게 변수를 출력할 수 있을까?
#include <stdio.h> int main() { int a = 1; printf("%d", a); return 0; // output : 1 }
모범 답안이다. 출력할 변수의 형식에 따라 %<변수의 자료형>을 명시한 후, 변수명을 ,(콤마)로 분리하여 나타낸다.
주요 자료형에 따른 접미사는 다음과 같다.
자료형 형식 문자 Character (문자) %c Decimal / Integer (10진수 정수) %d, %i Unsigned decimal (부호 없는 10진수 정수) %u octal (8진수 정수) %o heXadedimal integer (부호 없는 16진수 정수) %x, %X Floating-point %f, %F string (문자열) %s, %S 예시 문제 - 정올 #106
문제
세 개의 정수형 변수를 선언하고 각 변수에 10 20 30을 대입한 후 그 변수를 이용하여 출력 예와 같이 출력하는 프로그램을 작성하시오.
예제
입력
입력은 없다.
출력
10 + 20 = 30
세 개의 변수를 선언해야 한다. 세 변수를 형식에 맞게 출력만 하면 되는 쉬운 문제이다.
#include <stdio.h> int main() { int a = 10; int b = 20; int c = 30; printf("%d + %d = %d",a, b, c); return 0; } // output : 10 + 20 = 30
정수형 변수를 뜻하는 형식 문자 %d를 세 번 사용하여 출력하는 데에 성공했다.
위와 같이 형식 문자의 수와 인수로 들어간 변수의 수는 동일해야 한다.
큰따옴표 출력하기
큰따옴표를 출력해보자.
뼈에 저리도록 "생활"은 슬퍼도 좋다. 저문 들길에 서서 푸른 별을 바라보자
위와 같은 문자열을 출력하려고 한다. 위 시는 신석정 시인의 "들길에 서서" 이다.
#include <stdio.h> int main() { printf("뼈에 저리도록 "생활"은 슬퍼도 좋다.\n"); printf("저문 들길에 서서 푸른 별을 바라보자"); return 0; } // 구문 오류
버그가 발생한다. 이는 문자열을 감싸는 큰따옴표가 문자열에 사용되었기 때문이다.
일반적으로 printf()는 큰따옴표로 감싼 문자열을 출력하는 기능이다. 따라서 "뼈에 저리도록" 과 "은 슬퍼도 좋다.\n" 이라는 두 부분으로 나뉘어졌고, "생활" 은 식별자로 취급되었다. (식별자 : 변수명과 같이 가상 메모리 공간을 정의하는 문자열)
그렇기 때문에 오류가 발생한다.
이 문제를 해결하기 위해서는 이스케이프 시퀀스를 적절히 활용해야 한다. \" 이스케이프 시퀀스를 사용하면 큰따옴표를 버그 없이 사용할 수 있다.
#include <stdio.h> int main() { printf("뼈에 저리도록 \"생활\"은 슬퍼도 좋다.\n"); printf("저문 들길에 서서 푸른 별을 바라보자"); return 0; } // output : 뼈에 저리도록 "생활"은 슬퍼도 좋다. // 들길에 서서 푸른 별을 바라보자
이스케이프 시퀀스에 대해 잠깐 설명하자면, 여러 문자를 출력하기 위해 사용되는 문자열이다. 자주 사용되는 이스케이프 시퀀스는 다음과 같다.
기능 이스케이프 시퀀스 New line (새로운 줄, 개행) \n Tab (탭 문자) \t \ (역슬래시 출력) \\ ' (작은따옴표 출력) \' " (큰따옴표 출력) \" ? (물음표 출력) \? 이외에도 여러 이스케이프 시퀀스가 존재하지만 거의 사용되지 않는다.
예시 문제 - 백준 10171번
문제
아래 예제와 같이 고양이를 출력하시오.
입력
없음.
출력
\ /\ ) ( ') ( / ) \(__)|
역슬래시와 작은따옴표를 출력해야 하는 문제이다. C에서 작은따옴표는 문자 하나를 위해서만 사용되기 때문에, 문자열을 출력할 때에는 문제를 일으키지 않는다. 여기에서는 연습을 위하여 작은따옴표까지 이스케이프 시퀀스를 사용하는 것으로 한다.
#include <stdio.h> int main() { printf("\\ /\\\n"); printf(" ) ( \')\n"); printf("( / )\n"); printf(" \\(__)|"); return 0; } //output : \ /\ // ) ( ') //( / ) // \(__)|
귀여운 고양이를 출력할 수 있다. 줄의 뒤에 \n을 넣어주는 것을 잊지 말자.
플래그 지시문
변수 등을 출력 시, 출력 형식을 지정할 수 있다. 오른쪽 정렬을 한다거나, 소숫점 아래 표시할 자리를 선택한다거나 하는 것들을 할 수 있다.
플래그 지시문은 %와 <접미사> 사이에 붙이는 형식으로 작동한다. 다음은 자주 사용되는 플래그 지시문이다.
기능 플래그 왼쪽 정렬 - 오른쪽 정렬 (생략 가능) + 소숫점 아래 자리 출력 (정밀도) . 어떻게 사용하는지 알아 보자.
#include <stdio.h> int main() { int a = 0; double b = 1.55; printf("%-10.1f %10d", b, a); return 0; } // output : 1.6 0
%-10.1f의 뜻은 실수형인 변수를 출력할 공간을 10칸 확보 후, 왼쪽 정렬하여 소숫점 첫째 자리까지 출력하라는 뜻이다.
이런 경우에 변수는 소숫점 둘째 자리에서 반올림되어 결과적으로 1.6이 출력된다.
%10d는 정수형인 변수를 출력할 공간을 10칸 확보 후, 오른쪽 정렬하여 출력하라는 뜻이다.
이러한 식으로 출력할 데이터를 보기 편하게 정렬할 수 있다.
최소 길이, 기본 길이의 존재
모든 변수는 최소 출력 길이가 존재한다. 이는 정수형이나 문자열 변수가 잘려서 출력되지 않도록 한다.
다음은 그 예시이다.
#include <stdio.h> int main() { int a = 10000; printf("%3d", a); return 0; } // output : 10000
우리는 정수형 데이터를 세 자리까지만 출력하려고 한다. 그러기 위해 %3d를 사용하였는데, 출력할 데이터 10000은 다섯 자리다.
%3d에서 출력하려고 하는 대로라면 100만이 출력되고, 나머지는 잘려서 나와야 한다. 하지만 10000이 출력되었다.
여기서 알 수 있는 것은, 플래그 지시문은 최소 길이가 존재한다는 것이며, 그 최소 길이는 변수의 자릿수와 같다.
최소 길이보다 작은 수를 플래그로 지정하면 해당 내용은 무시된다.
실수형에는 기본 길이가 존재한다.
#include <stdio.h> int main() { double a = 3.1415926535897932384626; printf("%f", a); return 0; } output : 3.141593
방금 봤던 대로라면, 딱히 지정을 해 주지 않았을 때에는 변수 전체가 출력되어야 한다. 하지만 여섯째 자리까지만 출력되었다.
이것이 실수형 변수를 출력할 때의 특징이다. 지정해 주지 않는다면 소숫점 아래 여섯자리까지만 나타낸다.
이는 소숫점 아래 여섯번째 자리가 없을 때도 적용되는데, 1.5라는 실수형 변수를 출력하면 1.500000으로 여섯 자리를 맞추어 출력된다. 더 길게 출력해주고 싶다면 %.10f와 같은 식으로 정밀도를 조정해 주면 된다.
연습 문제 - 정올 #105
문제
다음 출력 예와 같이 모든 단어를 15칸씩 오른쪽에 맞추어 출력되는 프로그램을 작성하시오.
예제
Seoul 10,312,545 +91,375 Pusan 3,567,910 +5,868 Incheon 2,758,296 +64,888 Daegu 2,511,676 +17,230 Gwangju 1,454,636 +29,774
오른쪽 정렬로 출력하는 문제이다.
출력할 것은 문자열이기 때문에 %15s를 사용하면 된다.
단, %15s와 %15s 사이에 띄어쓰기를 하면 16칸이 되므로 붙여 써 주어야 한다.
#include <stdio.h> int main() { printf("%15s%15s%15s\n", "Seoul", "10,312,545", "+91,375"); printf("%15s%15s%15s\n", "Pusan", "3,567,910", "+5,868"); printf("%15s%15s%15s\n", "Incheon", "2,758,296", "+64,888"); printf("%15s%15s%15s\n", "Daegu", "2,511,676", "+17,230"); printf("%15s%15s%15s", "Gwangju", "1,454,636", "+29,774"); return 0; } // output : // Seoul 10,312,545 +91,375 // Pusan 3,567,910 +5,868 // Incheon 2,758,296 +64,888 // Daegu 2,511,676 +17,230 // Gwangju 1,454,636 +29,774
반응형'정리노트 > C언어 정리노트' 카테고리의 다른 글
4. 입력 (0) 2025.01.20 2. C언어 코드의 기본적 구조 (0) 2025.01.15 1. C언어 시작하기 (0) 2025.01.15 0. 비주얼 스튜디오 설치하기 (VS2022) (0) 2025.01.15