안녕하세요, 플랜티어린입니다.
먼저 해당 글은 C언어 공부를 기록하기 위한 것입니다.
제가 남기는 기록이 저와 같이 처음 프로그래밍을 학습하시는 분들께 도움이 되길 바랍니다.
scanf_s()
scanf_s()는 사용자가 입력한 데이터를 받아 변수에 저장하는 함수이며, 헤더파일 <stdio.h>에 정의되어 있는 기본 제공 함수입니다. (기존 scanf()에서 오버플로우 공격을 막기 위해 변경됨)
데이터를 출력하는 printf()와 반대되는 함수라고 생각할 수 있습니다.
scanf_s()의 형식은 다음과 같습니다. (문자열 제외 다른 자료형의 경우)
scanf_s(" %d", &x); //이전에 int x를 정의했다고 가정
물론 이때는 scanf() 문장 이전에 int 변수 x가 정의되어 있어야 합니다.
다들 눈치채셨겠지만, %d 자리에는 다른 형식지정자가 들어올 수 있습니다. 그리고 이때는 변수의 자료형이 형식지정자와 일치해야 합니다.
또한, 변수 앞에 앰퍼샌드(&) 기호를 써야 합니다.
scanf_s()로 문자열을 입력받을 때는
형식지정자 %s를 사용하고 문자 배열을 정의한 변수 앞에는 앰퍼샌드(&)를 붙이지 않아도 됩니다.
scanf_s(" %s", str, 입력받을 문자열의 길이); //이전에 문자 배열 str를 정의했다고 가정
앞선 다른 자료형과의 차이점이 보이시죠? 바로 입력받을 문자열의 길이를 따로 적어야 한다는 것입니다.
기존 scanf()와 다르게 오버플로우를 막기 위해 변경되었다고 하네요.
scanf_s()로 문자열을 입력받을 때 중요한 점은 스페이스가 나오면 scanf()가 중지된다는 것입니다.
즉, 위의 예시처럼 %s를 한 번만 사용한 경우 scanf_s()로는 한 단어의 문자열만 입력받을 수 있습니다.
그렇다면 scanf_s()로 하나 이상의 단어를 입력받는 방법은 무엇일까요?
바로 %s를 여러 번 사용하거나 scanf_s()를 여러 번 사용하는 것입니다.
scanf_s(" %s %s %s", str1, 50, str2, 50, str3, 50);
//'문자 배열, 입력받을 문자열의 길이' 순으로 각각의 문자배열에 대해 번갈아가며 적어야 함
//str1, str2, str3에 입력받을 문자열의 최대 길이가 각각 50이라고 가정
scanf_s(" %s", str1, 50);
scanf_s(" %s", str2, 50);
scanf_s(" %s", str3, 50);
이렇게 되면 사용자가 단어 사이에서 스페이스바를 눌렀을 때 str1, str2, str3에 각각의 단어가 저장됩니다.
(두 경우 모두 콘솔 창에서의 입력 방법이 각 단어 사이 스페이스를 넣는 것으로 같음)
(+ '입력받을 문자열의 길이' 자리에 sizeof()를 사용하면 'unsigned int 대신에 unsigned _64int가 전달되었다'는 경고가 뜸(C6328))
이후에
printf("%s %s %s", str1, str2, str3); //-> 출력 내용: str1 str2 str3
을 이용하면 사용자가 입력한대로 출력할 수 있겠습니다.
추가로,
함수를 이용할 때 반환값으로 str1, str2, str3를 합친 문자배열을 넣기 위해 하나의 문자열로 합치려고 시도해보았습니다.
다음과 같이 strcat_s() 함수를 사용하여 각각을 합쳐보았을 때,
strcat_s(str1, 50, str2); //strcat_s(문자열1, 합쳐질 문자열1의 최대 길이, 문자열2);
strcat_s(str1, 50, str3);
출력은 되었지만, 경고가 떴습니다. (C6054)
이를 개선하기 위해 다음과 같이 위쪽에 str2, str3에 각각 "\0"을 추가하였더니 오류가 발생하지 않았습니다.
그리고 다음과 같이 scanf_s()를 3번 사용하여 문자열을 입력받은 후에 strcat_s()로 문자열을 합쳐봐도
(+ 위의 예시처럼 NULL문자를 str2, str3 뒤에 따로 추가하지 않았을 때) 같은 경고(C6054)가 떴습니다.
현재로서는 그 이유를 모르겠네요.. 공부하다가 나중에라도 알게 되면 추가로 포스팅하도록 하겠습니다.
혹시 아시는 분은 댓글 남겨주시면 감사하겠습니다.
scanf_s() 사용 시의 주의점
scanf_s() 사용할 때 주의할 점은 \n, \t, \a 등과 같은 이스케이프 시퀀스를 사용하지 않는 것입니다.
이들은 오류나 경고는 뜨지 않지만 효과가 없습니다. (\0의 경우 오류 뜸)
이번 포스팅에서는 scanf_()의 사용법과 strcat_s()의 간단한 예시를 살펴보았습니다.
오늘도 글을 읽어주셔서 감사합니다.

참고 자료
strcat_s, wcscat_s, _mbscat_s, _mbscat_s_l | Microsoft Docs
C6054 | Microsoft Docs
'C언어' 카테고리의 다른 글
if - else if - else를 활용한 조건문 만들기 (0) | 2022.08.03 |
---|---|
C언어 - #include, #define (전처리기 지시어), 헤더파일 작성 (0) | 2022.07.20 |