학습(Study) & 목표(Objective)
scanf() 함수 사용법은 2번째로 나왔어야 됐는데, 누락이 되어 6번째로 밀렸네요. 가볍게 봐주시면 좋겠습니다.
C언어에서 문자열이나 문장, 문자를 입력받을 때 어떻게 입력을 받을 수 있을까요? 다양한 방법이 있지만, 가장 먼저 접하게 되는 것이 scanf() 함수입니다. 말 그대로 format의 형식대로 무엇인가를 scan 한다는 의미이죠.
ch 변수에 하나의 문자를 입력받는 방법은 scanf("%c", &ch); 로 사용하실 수 있습니다. 그리고 printf("%c", ch); 로 표준 출력 화면(모니터)에 표시하실 수 있고요.
char ch;
scanf("%c", &ch);
printf("%c", ch);
C언어의 scanf 함수는 또 문자열을 입력받을 수 있는데요, scanf("%s", s) 형식으로 받을 수 있어요. 하지만, 공백문자는 구분자로 사용되기 때문에 첫 번째 공백이 나올 때까지만 문자열 접근을 허용하게 돼요.
char s[MAX_LEN]이 선언되어있다고 했을 때, scanf 함수로 줄 단위로 입력을 받기 위해서 scanf("%[^\n]%*c", s);를 사용할 수 있어요. MAX_LEN은 배열 a의 최대 크기라고 보시면 돼요.
여기서 대괄호([])는 스캔 셋(scan set) 문자입니다. C언어에서 \n의 n은 new line을 의미하는데, ^\n은 개행문자가 나올 때까지 입력을 받는 것을 의미합니다. 그 뒤의 %*c 개행문자를 읽습니다. * 문구는 개행문자가 버려져 다시 입력을 받는다는 의미로 보시면 되겠습니다.
참고로 문자와 문자열을 입력한 후 scanf("%[^\n]%*c", s); 를 사용해도 제대로 동작하지 않아요. 각 줄의 마지막에는 항상 줄 바꿈 문자가 있어서, 이전 라인의 줄 바꿈 문자를 읽기 때문입니다. 이러한 문제는 다양한 방법으로 제어할 수 있는데, 마지막 줄 전에 scanf("\n"); 를 사용해서 제어할 수 있어요.
과제(Task)
ch 변수로 하나의 문자를 입력받고, s 변수로 문자열을, sen 변수로 문장을 입력받아 출력하는 프로그램을 작성하자.
입력 형식(Input Format)
처음 입력 : ch
두 번째 입력 : s
세 번째 입력 : sen
제약 조건(Constraints)
-
출력 형식(Output Format)
3줄에 걸쳐 출력한다.
첫 번째 줄에는 ch에 저장된 문자를 출력
두 번째 줄에는 s에 저장된 문자열을 출력
세 번째 줄에는 sen에 저장된 문단을 출력
입력 예제(Sample Input)
C
Language
Welcome To C!!
출력 예제(Sample Output)
C
Language
Welcome To C!!
주어진 코드
#include <stdio.h> #include <stdlib.h> int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ return 0; } |
풀이 코드 및 해설
#include <stdio.h> #include <stdlib.h> int main() { char ch = '0'; char s[256] = {0}; char sen[256] = {0}; scanf("%c", &ch); scanf("%s", s); scanf("\n"); scanf("%[^\n]%*c", sen); printf("%c\n", ch); printf("%s\n", s); printf("%s\n", sen); return 0; } |
C
Language
Welcome To C!!
를 생각해봤을 때, 각 문장의 끝에 줄 바꿈 문자가 있다고 보시면 됩니다.
C\nLanguage\nWelcome To C!!\n
컴퓨터는 이런 식으로 인식을 하는 거죠.
코드를 따라가 보면 알 수 있죠.
처음 ch를 입력받을 때
scanf("%c", &ch);
C\nLanguage\nWelcome To C!!\n
두 번째 문자열 s를 받을 때
scanf("%s", s);
C\nLanguage\nWelcome To C!!\n
scanf("\n") 없이 세 번째 문단 sen을 받을 때
scanf("%[^\n]%*c", sen);
C\nLanguage\nWelcome To C!!\n
이전에 Language까지 읽었기 때문에, 줄넘김 문자가 남아있던 겁니다. 일반 scanf("%s", sen); 이었다면, 기본적으로 처리되어 Welcome이 출력되겠죠구체적으로 궁금하신 사항이 있으면 댓글 달아주세요.)
하지만, [^\n] 조건이 있으므로, \n을 발견하고 바로 개행 문자(\n)만 읽고 멈춘 거라고 보면 되겠습니다.
해결방안은 scanf("\n"); 으로 \n 문자를 한 번 입력 받고, 진행하는 거죠.
다시 두 번째 문자열 s를 받은 직후로 넘어가면
scanf("%s", s);
C\nLanguage\nWelcome To C!!\n
마지막으로
scanf("%[^\n]%*c", sen);
C\nLanguage\nWelcome To C!!\n
입력받은 후 ch, s, sen을 출력하면 됩니다.
다른 방법
#include <stdio.h> #include <stdlib.h> int main() { char ch = '0'; char s[256] = {0}; char sen[256] = {0}; // 각 scanf마다 끝에있는 // 문자(개행 문자)를 무시 한다는 의미 scanf("%c%*c", &ch); scanf("%s%*c", s); scanf("%[^\n]%*c", sen); // 아래의 코드는 s가 개행문자를 구분자로 사용되어 // 개행 문자가 자동으로 무시되어 정상 동작한다. // scanf("%c %s %[^\n]%*c", &ch, s, sen); printf("%c\n", ch); printf("%s\n", s); printf("%s\n", sen); return 0; } |
'C Programming > 연습 문제' 카테고리의 다른 글
[C언어 연습문제]강좌 8. Bitwise Operators(과제를 통한 비트 연산자의 활용) (0) | 2019.03.18 |
---|---|
[C언어 연습문제]강좌 7. For Loop in C(C언어 for문) (0) | 2019.02.27 |
[C언어 연습문제]강좌 5. Conditional Statements in C(C언어 if 조건문), 숫자 조건을 영어로 표현하기) (0) | 2019.02.18 |
[C언어 연습문제]강좌 4. Pointers in C(포인터로 2개의 변수를 반환하는 함수 구현) (0) | 2019.02.16 |
[C언어 연습문제]강좌 3. Functions in C(최대 값을 구해보자 ) (0) | 2019.02.16 |