PS (C, C++)

[백준/C & C++] 4740 거울, 오! 거울

최연재 2023. 2. 11. 01:02

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

 

4740번: 거울, 오! 거울

하나 또는 그 이상의 줄에 각각 ASCII 글자로 나타낼 수 있는 단어들(알파벳, 숫자, 공백, 구두점 등)로 구성된 문장을 입력한다. 각 문장은 최소 1글자에서 최대 80글자로 이루어져 있으며, ***을

www.acmicpc.net

C

#include <stdio.h>
#include <string.h>

int main()
{
	char s[81]="";
	while (1)
	{
		scanf("%[^\n]", s);
		if (!strcmp(s, "***")) break;
		else
		{
			for (int i = strlen(s) - 1; i >= 0; i--) printf("%c", s[i]);
			printf("\n");
		}
		getchar();
	}
	return 0;
}

C++

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	char s[81];

	while (1)
	{
		cin.getline(s, 81, '\n');
		if (!strcmp(s, "***")) break;
		else
		{
			for (int i = strlen(s) - 1; i >= 0; i--) cout << s[i];
			cout << endl;
		}
	}
	return 0;
}

코드 설명

'\n'을 만나면 입력을 종료해야 하므로 c의 경우에는 scanf("%[^\n]", s);과 같은 코드를 작성했고, c++의 경우에는 cin.getline(s, 81, '\n');이라는 코드를 작성했다. 

 

무한루프를 돌면서 문자열을 입력받고, 문자열이 ***일 경우 루프를 탈출하게 하고, 그렇지 않을 경우 문자열을 역순으로 출력했다. 이후 줄바꿈을 해준다. 

 

느낀 점

; 사실 버퍼에 대해서는 잘 알지 못한다. 몇 번 이런 경험이 있어서 자연스럽게 getchar();를 추가해서 문제를 풀곤 했는데 이번 기회에 구글링을 통해서 이유를 알았다. 아직 개념이 부족해서 아래에 적을 내용에 오류가 있을 수도 있는데 오류가 있다면 댓글 달아주세요!

 

 scanf("%[^\n]", s)은 '\n'을 만나기 전까지의 모든 문자열을 버퍼에 저장하라는 뜻이다. 그러면 입력된 '\n'은 입력버퍼에 그대로 남아있는데, 이를 제거하지 않고 다시  scanf("%[^\n]", s)를 실행하니 내가 원하는 결과가 나올 수 없는 것이었다. 그래서 getchar()은 입력버퍼에서 문자 하나를 가져오는 역할을 해서 여기에서는 '\n'을 입력버퍼에서 없앤다!  

 

새롭게 알아가는 내용이 있었던 문제였다.

 

버퍼 내용 참고 블로그 링크 : 

https://omyodevelop.tistory.com/120

 

[C/C++] C언어 공백 문자 포함한 문자열 입력받는 방법 (scanf / fgets)

안녕하세요 omyo 입니다. 이번 포스팅에서는, 공백 문자를 포함한 문자열을 입력받는 2가지 방법에 대해서 소개해 드리려고 합니다. scanf("%s",문자열) 을 이용해서 문자열을 받으면, scanf는 공백을

omyodevelop.tistory.com

https://plustag.tistory.com/1

 

c언어에서 입력버퍼 비우기

c언어에서 가끔 발생하는 문제가 scanf로 입력받다가 입력버퍼가 다 비워지지 않아서 문자입력받는게 씹히는 경우가 생긴다. c언어 공부하다보면 꼭 한번쯤은 겪어보는 문제 예를 들면 #include int

plustag.tistory.com