
첫 번째 인자로 입력 형식 문자열을 받고, 이후 인자로 입력받은 값을 저장할 변수의 주소를 받습니다.
성공적으로 읽은 항목의 수를 리턴합니다. 만약 입력의 끝에 도달하거나 오류가 발생한 경우, EOF (보통 -1)를 리턴합니다.
scanf에러시
1.scanf_s 사용하기: scanf 대신 scanf_s를 사용하면 이 경고를 피할 수 있습니다.
2.프로젝트 설정 변경하기: 프로젝트의 컴파일러 옵션에서 _CRT_SECURE_NO_WARNINGS를 정의하여 이 경고를 비활성화할 수 있습니다.
Visual Studio에서 프로젝트를 선택하고 오른쪽 클릭합니다.
[속성]을 선택합니다.
구성 속성 > C/C++ > 전처리기 아래로 이동합니다.
전처리기 정의 항목에 _CRT_SECURE_NO_WARNINGS를 추가합니다.
3.코드에 #define 사용하기: 소스 코드 상단에 아래의 #define을 추가하여 경고를 비활성화 할 수 있습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
공백이 포함된 문자열을 입력받고 출력

이 코드에서 scanf(" %[^\n]", str);는 사용자가 엔터 키를 누를 때까지 모든 문자(공백 포함)를 입력받아 str 배열에 저장합니다. %[^\n] 형식 지정자는 개행 문자를 만나기 전까지 입력을 계속 받으므로, 여러 단어와 공백을 포함하는 문자열도 한 번에 입력받을 수 있습니다.
또한, scanf 형식 지정자 앞에 있는 공백( )은 사용자가 이전에 입력한 개행 문자를 무시하도록 해줍니다. 이는 사용자가 이전에 다른 입력을 한 후 엔터 키를 누른 경우에도 문자열을 제대로 입력받을 수 있게 해줍니다.
이 방법은 고정된 크기의 배열을 사용하여 문자열을 저장하므로, 배열의 크기를 넘어서는 입력에 대해서는 주의해야 합니다. 너무 긴 입력은 버퍼 오버플로우를 일으킬 수 있습니다.


왜 이상한 문자가 써지는걸까?
문제의 원인은 scanf의 동작 방식과 버퍼에서 남아 있는 개행 문자 (newline, '\n')에 있습니다.
첫 번째 scanf가 문자열을 입력받고 난 후, 개행 문자가 버퍼에 남아 있게 됩니다. 따라서 두 번째 scanf가 실행될 때 이전에 버퍼에 남아 있던 개행 문자를 즉시 읽어들여 바로 종료됩니다.
이 문제를 해결하기 위해서는 첫 번째 scanf 후에 버퍼를 비워주는 방식이 필요합니다.
다음과 같이 getchar() 함수를 사용하여 버퍼를 비울 수 있습니다:
while(getchar() != '\n'); // 버퍼 비우기

getchar()는 C 표준 라이브러리 함수로, 표준 입력(대부분 키보드)에서 한 문자를 읽어들이는 기능을 합니다. 읽어들인 문자를 반환합니다.
while (getchar() != '\n'); 구문은 표준 입력 버퍼에 남아 있는 문자들을 순차적으로 읽어들이면서, 개행 문자('\n')를 만날 때까지 계속 반복하는 것을 의미합니다.
여기서 '\n'은 개행 문자로, 보통 Enter 키를 눌렀을 때 입력되는 문자입니다.
이 구문의 주요 용도는 이전의 입력에서 버퍼에 남아있는 문자들, 특히 개행 문자를 제거하기 위해서 사용됩니다. scanf와 같은 함수로 입력을 받을 때, 입력의 끝을 알리는 Enter 키를 누르면, 입력된 데이터와 함께 개행 문자도 버퍼에 남게 됩니다. 이 후의 scanf나 다른 입력 함수들이 그 개행 문자를 바로 읽어서 원치 않는 동작을 할 수 있기 때문에, 이를 방지하기 위해 버퍼를 비워주는 역할로 while (getchar() != '\n');를 사용하는 것입니다.
주의


while (getchar() != '\n'); 부분은 버퍼를 비우기 위해 사용되는 코드입니다. 그러나 주어진 코드에서는 그 이전에 scanf 또는 다른 입력 함수를 사용하지 않았기 때문에, 버퍼에 남아있는 문자가 없다면 사용자로부터 입력을 기다리게 됩니다. 따라서 이 코드를 해당 위치에서 사용하는 것은 부적절합니다.
메모리 해제 후 접근: free(s31); 뒤에 printf("%s\n", s31);로 메모리에 접근하고 있습니다. 메모리를 해제한 후 그 메모리 영역에 접근하면 정의되지 않은 동작이 발생할 수 있습니다. 따라서 메모리를 해제한 후에는 그 메모리 영역에 접근하면 안 됩니다.