본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 6. Playing With Characters(문자 입력), scanf()로 공백 입력받기

by 희품 2019. 2. 19.
반응형


학습(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;
}




문제 풀이만을 위해서라면 다양한 방법으로 줄 개행 처리를 할 수 있겠죠.
마지막 scanf를 scanf(" %[^\n]%*c", sen); 으로 공백 문구를 넣어 \n을 한 번 넘기는 방법도 있습니다.

C언어를 배우기 시작할 때, 가장 먼저 사용하게 되는 입/출력 printf와 scanf는 알고 보면 상당히 복잡한 함수라고 볼 수 있으니, 초반에 너무 깊게 들어가면 포기하는 경우가 많다고 하더라고요. 이해가 안 가도, 실제로는 문제가 될만한 상황은 거의 없으니(scanf를 많이 사용하는 실무 프로그램은 흔하지 않습니다.) 가볍게 그렇구나 하고 넘어가시면 되겠습니다.

반응형