C언어 입출력

Ohyuchan·2023년 8월 7일
0
post-thumbnail

이번 포스팅에서는 C언어 입출력문에 대해서 작성하였습니다.
C언어의 입력은 scanf/scanf_s를 통해서 입력되며 출력은 printf를 통해서 출력이 됩니다.

⇲ 입력(scanf & scanf_s)

값을 입력 받기 위해서는 우선 데이터를 저장할 저장 공간이 있어야 합니다.
즉 변수를 생성해야 합니다. ex) int number;

scanf_s() 기능을 사용해서 저장 공간에 입력한 데이터를 저장

scanf_s([데이터 형식], [저장 공간의 주소])
[ 데이터 형식 ] : 입력받을 데이터의 형식(변환 문자)
[ 저장 공간의 주소 ]: 입력받은 데이터를 저장할 저장 공간의 '주소'

위와 같은 형식으로 값을 입력 받을 수 있습니다.

// & : 주소 연산자, 저장 공간의 주소를 알려준다.
    scanf("%d",&inputNum);
    printf("%d\n",inputNum);

    int number1,number2;
    printf("정수를 입력해주세요 : ");
    scanf("%d %d",&number1,&number2);
    printf("%d + %d = %d\n",number1,number2,number1+number2);

scanf & scanf_s


scanf와 scanf_s의 차이는 무엇인가?

scanf & scanf_s 함수

int scanf(const char * format,);
int scanf_s(const char * format,);

scanf와 scanf_s 함수는 표준 입력(키보드)에 입력한 내용을 포맷에 맞게 얻어오는 함수이다.
그리고 scanf_s 함수는 scanf 함수의 안전한 버전의 함수이다.

scanf 함수의 반환 값은 포맷 서양자에 맞게 변환한 개수이며 포맷 사양하자는 printf에서 사용하는 것과 거의 같다.
double 형식 실수를 입력받을 때 %f 대신 %lf를 사용하는 정도가 차이점이다.

scanf 함수와 scanf_s 함수는 포맷에 맞지 않는 부분이 있으면 더 이상 작업을 진행하지 않는다.
그리고 %s 포맷은 공백이나 탭, 엔터를 만나기 전까지 문자열만 변환한다.
공백을 포함해서 문자열을 입력받을 때는 gets나 gets_s를 사용해야 한다.

그리고 scanf 함수에서는 입력한 내용을 호출한 곳의 변수에 설정하는 일을 합니다.
따라서 호출하는 곳에서는 변수의 주소를 전달해야 한다
변수의 메모리 주소를 얻을 때는 주소 연산자(&)를 사용해야 한다.

#pragma warning(disable:4996) //경고 메시지를 오류 목록에 표시하지 않게 함
#include <stdio.h>
int main()
{
    int a=0, b=0, c=0, d=0;
    int re = 0;

    printf("네 개의 정수를 다음의 예처럼 입력하세요.\n");
    printf("입력 예: 255.34.198.34\n");
    re = scanf("%d.%d.%d.%d",&a,&b,&c,&d); //포맷에 맞게 입력한 부분만 변환함
    printf("입력 포맷에 맞게 전달하여 변환이 성공한 개수는 %d개 입니다.\n",re);
    printf("입력한 것을 변환한 결과: %d.%d.%d.%d \n",a,b,c,d);
    return 0;
}
◈ 실행 결과

//네 개의 정수를 다음의 예처럼 입력하세요.
//입력 예: 255.34.198.34
//123.45.23ab45
//입력 포멧에 맞게 전달하여 변환 성공한 개수는 3개 입니다.
//입력한 것을 변환한 결과: 123.45.23.0

그런데 scanf 함수를 사용하면 컴파일 경고 메시지가 나온다.
포맷에 맞게 변환하여 입력 인자로 받은 주소에 값을 지정하는 과정에서 전달받은 메모리 크기를 벗어날 위험이 있다.

이러한 버퍼 오버플로우 문제를 개선한 함수가 scanf_s 함수다.
scanf_s함수는 대부분 scanf함수 사용법과 거의 같다.
차이가 있는 부분은 문자나 문자열을 입력받을 때 버퍼 길이도 전달해야 한다는 것이다.

⇲ printf

printf([출력하고 싶은 내용]) : print(출력) : 출력 기능

  • ""(큰 따옴표) : 텍스트를 작성할 때 사용.
  • \n : 줄바꿈 문자
#include <stdio.h>//include : 포함하다
// stdio.h : std(standard 표준) + io(input/output 입력/출력 입출력)
// = 표준 입출력 기능
// 표준 입출력 기능을 포함한다. (= 표준 입출력 기능을 사용하겠다!)

int main(){//main : 실행부
    #pragma region 출력
    // printf([출력하고 싶은 내용]) : print(출력) : 출력 기능
    // ""(큰 따옴표) : 텍스트를 작성할 때 사용.
    // \n : 줄바꿈 문자
    printf("Hello World!\n");
    printf("Hello World!");
    #pragma endregion

    return 0;
}
profile
안녕하세요

0개의 댓글