2022년 9월 8일에 작성됨
https://www.acmicpc.net/problem/10926
10926번: ??!
준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때
www.acmicpc.net
문제 분석
아이디는 문자열이므로 최대 50자인 문자열의 입출력을 하는 코드를 만든다.
소스 코드 -1 (⭕)
#include <stdio.h>
int main()
{
char a[51];
scanf("%s", a, sizeof(a));
printf("%s??!\n", a);
return 0;
}
코드 분석
아이디의 길이는 최대 50자 이므로 NULL 값까지 포함하여
크기가 51인 char형 배열을 선언한다.
문자열 입력이므로 %s이고, &은 생략하고, sizeof(변수명)로 입력받는다.
%s로 문자열 a와 뒤에 ??!까지 출력해준다.
💥여기서 잠깐!
코드 -1이 정답이라고 떴지만 뭔가 찝찝해서 검색해봤더니 올바르지 못한 풀이였다..!!
소스 코드 -2 (⭕)
#include <stdio.h>
int main()
{
char a[51];
scanf("%s", a);
printf("%s?\?!\n", a);
return 0;
}
1.
sizeof(변수명)은 Visual Studio에서 scanf_s로 입력받을 때 필요한 것...
scanf로 입력받는 곳에서는 굳이 넣어주지 않아도 된다.
2.
printf에서 그냥 ??!로 했을 때 정답이긴 하지만 아래와 같은 문구가 뜬다.
Main.c: In function ‘main’:
Main.c:9:19: warning: trigraph ??! ignored, use -trigraphs to enable [-Wtrigraphs]
9 | printf("%s??!\n", a);
|
이는 ??!가 C언어에서 삼중자로 인식했기 때문이다.
??!을 그대로 출력하면 | 부호가 출력될 것이다.
따라서 ?\?! 처럼 가운데 \을 입력하면 "??!"을 그대로 출력할 수 있다.
✍️scanf_s 문자열 입력에서 sizeof(변수명) 쓰는 이유!
int, float, double 같은 자료형은 자료형 크기가 일정하기 때문에 자료형을 입력받는데 문제가 없지만,
char, char[]형태인 문자(%c), 문자열(%s)에서는 입력받을 크기를 반드시 뒤에 입력해줘야 한다.
ex)
scanf_s("%c", &문자변수명, sizeof(문자변수명));
scanf_s("%s", 문자열변수명, sizeof(문자열변수명));
scanf일 땐 scanf("%s", 문자열변수명);
✍️C언어 삼중자 시퀀스
삼중자 | 문장 부호 문자 |
??= | # |
??( | [ |
??/ | \ |
??) | ] |
??' | ^ |
??< | { |
??! | | |
??> | } |
??- | ~ |
end
분명 간단한 문제였는데.. 파고들수록 관련 개념이 계속 나와서 찾아보는데 좀 오래걸렸다.
그래도 sizeof 내용이 항상 헷갈렸었는데 이번 기회로 어느정도 알게된 것 같다.
나는 비쥬얼 스튜디오로 코드를 짜서 돌려본 다음 _s만 없애고 백준 같은 사이트에 제출하는 방식으로 하는데 그래서 sizeof를 scanf에서는 안써도 되는걸 몰랐었다..
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[C]백준_10172 : 개 (0) | 2023.07.05 |
---|---|
[C]백준_10171 : 고양이 (1) | 2023.07.04 |
[C]백준_10869 : 사칙연산 (0) | 2023.07.02 |
[C]백준_10998 : A×B (0) | 2023.07.01 |
[C]백준_10718 : We love kriii (2) | 2023.06.30 |