관리 메뉴

드럼치는 프로그래머

[C] scanf()함수 예제1 본문

★─Programing/☆─C | C++

[C] scanf()함수 예제1

드럼치는한동이 2007. 11. 7. 00:26

%s형식지정자의 역할을 보기위해 다음 프로그램을 실행시켜 본다. 질의가 나오면, this is a test라고 타이핑하고 엔터키를 입력한다. 단지 this만이 화면에 다시 나타나는 것을 보게된다. 이것은 scanf()가 문자열을 읽을 때 공백, 탭, 혹은 뉴라인 문자를 만나면 읽는 것을 멈추기 때문이다.

#include <stdio.h>

int main(void) {
    char str[80];

    printf("enter a string: ");
    scanf("%s", str);
    printf(str);

    printf("\n");
    return 0;
}

사용자 삽입 이미지

다음은 대문자와 소문자 모두를 받아들이는 스캔셋의 예이다. 영문자 몇개를 입력한 다음, 다른 하나의 문자, 그리고 몇개의 영문자를 입력한다. 엔터키를 치면, 영문자가 아닌 문자 앞에 입력된 영문자들만이 str에 저장된다는 것을 알 수 있을 것이다.

#include <stdio.h>

int main(void) {
    char str[80];

    printf("enter letters, anything else to stop\n");
    scanf("%[a-zA-Z]", str);

    printf(str);

    printf("\n");
    return 0;
}

사용자 삽입 이미지

scanf()를 사용하여 공백문자를 포함하는 문자열을 읽으려면, 스캔셋을 이용할 수 있다. 다음 프로그램은 스캔셋을 이용하도록 이전의 프로그램을 약간 변경한 것이다.

#include <stdio.h>

int main(void) {
    char str[80];

    printf("enter letters and spaces\n");
    scanf("%[a-z A-Z]", str);
    printf(str);

    printf("\n");
    return 0;
}

사용자 삽입 이미지

거의 모든 종류의 문자열을 읽기 위하여 끝을 알리는 부호나 숫자를 사용할 수 있다.

다음 프로그램에서 사용자는 하나의 수, 연산자, 두번째 수를 순서대로 입력할 수 있다.(예:12+4) 그러면 이 프로그램은 두 수에 대하여 주어진 연산을 수행하며 결과를 출력한다.

#include <stdio.h>

int main(void) {
    int i, j;
    char op;

    printf("enter operation: ");
    scanf("%d%c%d", &i, &op, &j);

    switch(op) {
        case '+': printf("%d", i+j);
            break;
        case '-': printf("%d", i-j);
            break;
        case '/': printf("%d", i/j);
            break;
        case '*': printf("%d", i*j);
    }

    printf("\n");
    return 0;
}

사용자 삽입 이미지

첫번째 수와 연산자사이에 공백을 줄 수 없기 때문에 정보를 입력하기 위한 형식은 다소 엄격하다는 것에 주의하라. 이러한 제약을 없애는 것이 가능하다. 알다시피, %c지정자를 사용할 때를 제외하고 scanf()는 자동으로 선행하는 공백, 탭, 혹은 뉴라인 문자들을 무시한다. 그러나 연산자는 공백, 탭 혹은 뉴라인 문자가 될 수 없으므로 scanf()문장을 다음과 같이 수정할 수 있다.

scanf("%d %c%d", &i, &op, &j);

제어문자열에 공백이 있을 때마다, scanf()는 공백, 탭, 혹은 뉴라인이 아닌 문자를 만날 때까지 공백, 탭, 혹은 뉴라인문자들을 무시할 것이다. 이것은 공백, 탭, 혹은 뉴라인 문자가 없을 때도 포함한다. 이와같이 변경하면, 프로그램에 정보를 입력할 때, 첫번째 수와 연산자 사이에 한 개 이사의 공백을 둘 수 있다.

다음 프로그램은 최대 필드너비를 지정자와 함께 사용한다.

#include <stdio.h>

int main(void) {
    int i, j;

    printf("enter an integer: ");
    scanf("%3d%d", &i, &j);
    printf("%d %d", i, j);

    printf("\n");
    return 0;
}

사용자 삽입 이미지

이 프로그램을 실행하여 12345를 입력하면, i는 123, j는 45를 입력받을 것이다. 이러한 이유는 scanf()가 i의 필드는 단 3문자 길이라고 알고 있기 때문이다. 그리고 나머지 부분은 j에게 입력되는 것으로 알고 있다.

다음 프로그램은 공백, 탭, 혹은 뉴라인이 아닌 문자들을 제어문자열에 두는 효과를 보여준다. 이것은 10진수 값을 입력하는 것을 허용하나, 소숫점 왼쪽에 있는 숫자들을 하나의 정수형 변수에, 소숫점 오른쪽에 있는 숫자들을 다른 정수형 변수에 저장한다. 두 개의 %d지정자들 사이에 있는 소숫점이 입력된 수의 소숫점과 대응되며, 입력된 소숫점은 무시된다.

#include <stdio.h>

int main(void) {
    int i, j;

    printf("enter a decimal number: ");
    scanf("%d.%d", &i, &j);
    printf("left part: %d, right part: %d", i, j);

    printf("\n");
    return 0;
}

사용자 삽입 이미지
 

'★─Programing > ☆─C | C++' 카테고리의 다른 글

[C] C 표준 함수 memset  (1) 2008.03.18
[C] 다항식 덧셈 / C로 구현 (연결 리스트)  (0) 2007.11.27
[C] strtok구현  (0) 2007.11.07
[C] 2차원 배열 생성 malloc  (0) 2007.10.30
[C] 포인터, 배열, 구조체  (0) 2007.10.29
Comments