[C]백준_10926 : ??!

Alal11·2022년 9월 7일
0
post-thumbnail

출처

https://www.acmicpc.net/problem/10926


문제

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.


입력

첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.


출력

첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.


예제 입출력


알고리즘 분류

  • 구현

➡️문제 분석

아이디는 문자열이므로 최대 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;
}
  • sizeof(변수명)은 Visual Studio에서 scanf_s로 입력받을 때 필요한 것...
    scanf로 입력받는 곳에서는 굳이 넣어주지 않아도 된다.

  • 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에서는 안써도 되는걸 몰랐었다..ㅜㅜ

0개의 댓글