혹시 gets_s함수는 2번 이상 입력받지 못하나요?
조회수 491회
#include <stdio.h>
#include <string.h>
int main()
{
char str[128];
int key;
while (1)
{
printf("문자열?");
gets_s(str, sizeof(str));
printf("암호 키(정수)?");
scanf("%d", &key);
printf("입력된 문자열 : %s\n", str);
}
}
현재 실행결과
문자열?abc
암호 키(정수)?3
입력된 문자열 : abc
문자열?암호 키(정수)?qwe
입력된 문자열 :
문자열?암호 키(정수)?4
입력된 문자열 : qwe
문자열?암호 키(정수)?
제가 원하는 실행결과'
문자열?abc
암호 키(정수)?3
입력된 문자열 : abc
문자열?qwe
암호 키(정수)?4
입력된 문자열 : qwe
문자열?
질문내용
시저암호 문제를 풀던 도중 이해가 안 되는 부분만 따서 가져왔습니다. 위와 같은 현재 실행결과가 왜 나오는 건지, 원하는 실행결과가 나오게 하기 위해선 어떻게 해야 하는지 알려주시면 감사하겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
지금 생긴 문제는 scanf 함수 다음에 gets_s함수를 사용했기 때문입니다.
질문에서 처럼 3을 입력하고 엔터를 치게 되면, 입력 스트림이라는 곳으로 "3\n"이라는 값이 입력됩니다. 3은 숫자 3이고 \n은 엔터를 쳤기 때문에 입력된 값입니다.
이 상태에서
scanf("%d", &key);
를 실행하면, 입력 스트림에서 %d에 해당하는 정수 형태의 값인 3을 가져다가 정수로 변환하여 key에 넣어줍니다. 이제 입력 스트림에는 "\n"만 남아 있는 상태가 됩니다.그런데 get_s 함수는 입력 스트림으로부터 \n까지의 모든 문자들을 읽어 들이고 \n전까지의 내용을 배열에 저장하는 함수입니다.
현재 입력 스트림에 "\n"만 남아 있는 상태에서
gets_s(str, sizeof(str));
이 실행되었기 때문에, 함수가 실행은 되지만 배열 str에 저장할 값은 없고 str의 첫칸에 '\0'(널문자)만 저장됩니다.이러한 이유로 gets_s 함수가 스킵된 것처럼 느껴진 겁니다. 사실은 실행이 된 것이지요.
다시 정리하자면 이러한 일이 발생된 이유는 scanf 함수 직후에 gets 함수를 사용했기 때문입니다.
아래와 같이 해결하시면 됩니다.
#include <stdio.h> #include <string.h> int main() { char str[128], temp[128]; int key; while (1) { printf("문자열?"); gets_s(str, sizeof(str)); printf("암호 키(정수)?"); scanf("%d", &key); gets_s(temp, sizeof(temp)); printf("입력된 문자열 : %s\n", str); } }
- 결과
반드시 gets_s 함수를 써야하는 것이 아니라면 아래와 같이
scanf(" %s", str);
함수를 사용해도 됩니다. 이때" %s"
에서 %s 앞의 스페이스 한칸은 오타가 아니며 일부러 넣은 것입니다.scanf(" %s", str);
는 공백 문자 다음의 문자열을 str에 저장해 달라는 뜻입니다. 공백 문자는 스페이스나 \t, \n 등을 말합니다.#include <stdio.h> #include <string.h> int main() { char str[128]; int key; while (1) { printf("문자열?"); scanf(" %s", str); printf("암호 키(정수)?"); scanf("%d", &key); printf("입력된 문자열 : %s\n", str); } }
-
(•́ ✖ •̀)
알 수 없는 사용자
- 철수님 답변에 추가드리면 꼭 gets 함수를 써야한다면 scanf 이후에 fflush 로 stdin(입력버퍼)를 초기화 시켜야합니다. 김호원 2021.8.23 11:07
- 며칠 동안 계속 고민해도 모르겠어서 처음 질문해본 건데, 이렇게 친절하게 답변해주셔서 정말 감사드립니다. 알 수 없는 사용자 2021.8.23 17:38
댓글 입력