해결된 질문
작성
·
174
1
코드를 똑 같이 쓴거 같은데 출력이 제대로 안되요. 인터넷에 물어보니까 sizeof를 써야하던데 왜 써야 하는지 저는 왜 안되는지 잘 모르겠어요
답변 2
2
안녕하세요, 질문&답변 도우미 Soobak 입니다.
첨부해주신 코드를 자세히 보니, scanf()
함수가 아닌, scanf_s()
함수를 사용하셨네요.scanf_s()
함수는 scanf()
함수와 유사하지만, 문자열 입력에 대해서 버퍼의 크기를 인수로 추가해주어야 합니다.
이러한 문자열의 크기를 구하기 위해서 sizeof()
연산자가 사용되기도 하는데요,
질문자님께서 인터넷에 검색해보셨을 때, 말씀해주신 sizeof()
연산자 사용에 대한 내용이 검색된 것은 이러한 이유 때문인 것입니다.
한 번, scanf_s()
.함수 대신, scanf()
함수를 사용하셔서 컴파일 후 실행해보세요.
1
감사합니다 죄소하지만 한 가지만 더 물어보겠습니다. sizeof를 사용하면 str하고 sizeof(str)이라고 한번 더 사용해야 하던데 이유가 무엇인지 알 수 있을까요?
scanf_s("%s %d %d", str, sizeof(str), &i1, &i2);
printf("S: %s, Int1: %d, Int2: %d\n", str, i1, i2);
안녕하세요, 질문&답변 도우미 Soobak입니다.
우선 궁금해하시는 부분을 조금 더 명확히 해보자면,
sizeof
연산자를 사용하는 것이str
과sizeof(str)
둘을 인수로 전달해주어야 하는것의 이유가 아닙니다.scanf()
함수와scanf_s()
함수 각각이 요구하는 매개변수 형식이 다르기 때문에,scanf_s()
함수에서는 추가적으로str
의 크기를 인수로 넘겨주는 것입니다.기존
scanf()
함수는 버퍼의 크기를 체크하지 않기 때문에, 예상치 못한 긴 입력이 들어올 경우 메모리의 다른 부분을 덮어쓸 수 있습니다.이러한 문제를 해결하기 위해
scanf_s()
는 배열의 크기를 직접 명시하게 한 함수입니다.sizeof
연산자에 대한 사용예시는 강의 4.2 sizeof 연산자 를 잠시 둘러보셔도 도움이 되실 것 같습니다.문자열의 크기, 버퍼, 그리고 등에 대해서는 모두 이어지는 강의들에서 자세히 학습하시게 됩니다.