질문글도 많이 올라오는데 c++쓰는 사람들은 팁 하나 보고가라

scanf 쓰다가 cin을 쓰면 형식에 맞춰서 input을 받는 게 되게 어려운데, 헤더에 코드 몇 줄만 추가해주면 쉽게 할 수 있음.

#include <iostream>
#include <cstring>

//These are handy bits that go in a header somewhere template<class e, class t, int N> std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&sliteral)[N]) { e buffer[N-1] = {}; //get buffer in >> buffer[0]; //skips whitespace if (N>2) in.read(buffer+1, N-2); //read the rest if (strncmp(buffer, sliteral, N-1)) //if it failed in.setstate(std::ios::failbit); //set the state return in; } template<class e, class t> std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& cliteral) { e buffer(0); //get buffer in >> buffer; //read data if (buffer != cliteral) //if it failed in.setstate(std::ios::failbit); //set the state return in; } //redirect mutable char arrays to their normal function template<class e, class t, int N> std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) { return std::operator>>(in, carray); }

이 코드를 컴퓨터 어딘가에 저장해놓고 include해서 쓰셈.
사용법은 다음과 같음.

int main(void)
{
int x,y;
std::cout << "Input coordinate(ex: x=12,y=15):";
std::cin >> 'x' >> '=' >> x >> ',' >> 'y' >> '=' >> y; //whitespace between format characters are allowed when skipws is set; e.g x = 12, y = 15 is allowed
std::cout << x << ", " << y << '\n';
std::cout << "Input coordinate again without whitespace(ex: x=12,y=15):";
std::cin >> "x=" >> x >> ",y=" >> y; //whitespace between format characters are NOT allowed regardless of skipws flag; e.g x = 12, y = 15 is NOT allowed, only x=12,y=15 is allowed
if(std::cin.fail())
{
std::cout << "DONT PUT WHITE SPACE!\n";
return -1;
}
std::cout << x << ", " << y << '\n';
return 0;
}

입력:
x = 12, y = 15
x=12,y=15
출력:
12, 15
12, 15

입력:
x = 12, y = 15
x = 12, y = 15
출력:
12, 15
DONT PUT WHITE SPACE!

물론 입력 형식이 복잡해지면 정규표현식을 써야겠지만 간편하게 써먹기엔 꽤 좋은 코드임.
출처:https://stackoverflow.com/questions/17244181/reading-formatted-input-using-c-streams/17244442?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

10개의 댓글

2018.04.17
혹시 c언어 구조체 좀 할 줄 아십니까?
0
2018.04.17
@Tbps
문제가 있으십니까?
0
2018.04.17
@decltype
#include <stdio.h>

struct test { int field1; };

void sub(struct test b)
{
b.field1 = 1;
}

void main()
{
struct test a = { 0 };
sub(a);
printf("%d", a.field1);
}

위 코드랑

struct test { int field1; };

void sub(struct test *b)
{
b->field1 = 1;
}

void main()
{
struct test a = { 0 }; sub(&a);
printf("%d", a.field1);
}

위코드의 결과값이 다른데 왜그런거??
0
2018.04.17
@Tbps
&a
0
2018.04.17
@구리네스
그거랑 간접접근하는건 구조체 맴버 변수 데이터가 바뀌고 그냥 접근하는건 왜 안바뀌는거랑 관계있나요?
0
2018.04.17
@Tbps
몰라 그냥 유식해보이려고 써본거야
0
2018.04.17
@Tbps
첫번째 버전은 sub 함수가 인자 b를 pass-by-value로 받음.
즉 a와는 상관없는 sub 함수 내부의 test 구조체 b가 a로부터 복사되어서 생성되고, b의 field1이 바뀐뒤에 그냥 사라짐.

두번째 버전은 sub 함수가 인자 b를 pass-by-reference로 받음(포인터).
b는 main함수 스택에 있는 a를 가리키게 되고 sub함수에서 b가 가리키는 변수를 바꾸면 main함수에 있는 a도 같이 바뀜.
swap(a,b)는 작동 안하고 swap(&a,&b)는 작동하는 원리랑 똑같음.
0
2018.04.17
@decltype
아... 그럼 일반 매개변수로 했을때는

void func(int i){
i = 1;
}

이러는거랑 똑같은 건가 보네요...

ㅇㅎ;;
0
2018.04.17
@Tbps
ㅇㅇㅇ 좀 전에 일반 매개변수로 할 때는 인자 값 그대로 가져온다 그래서 식겁했는데
구조체나 일반 매개변수나 pass-by-value로 할 때의 규칙은 똑같기 때문에 main함수에 있는 변수의 값은 안 바뀜
0
2018.04.17
@decltype
조금만 더 생각했으면 다가갔을 개념인데 덕분에 쉽게 알고갑니다 ㄳㄳ
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180605 [컴퓨터] 윈도우10 노트북 화면 밝기가 자꾸 변하는데 해결 방법 좀 알... 2 두번하세요 0 32 분 전 12
180604 [프로그래밍] 공통코드테이블은 대체 왜 만드냐 2 잠적자 0 2 시간 전 132
180603 [잡담] PC방에선 무선이어폰 못쓰나? 1 급병신미 0 3 시간 전 115
180602 [컴퓨터] 모니터 이거 괜찮나여? 4 햄보칼쑤가없엉! 0 3 시간 전 108
180601 [프로그래밍] 토이프로젝트 주제 선정 2 개드립눈팅1세대 0 4 시간 전 105
180600 [모바일] 운동할때 쓸 무선이어폰 구합니다 6 물타다대주주 0 4 시간 전 83
180599 [컴퓨터] 다크플래시 df5000에 3rsys팬 껴도 되나요? 3 함박눈 0 5 시간 전 46
180598 [잡담] 아니 유선 무선 음질 차이 이정도였던거임? 와신상담 1 5 시간 전 83
180597 [컴퓨터] 윈도우 부팅 납치 해석 닉으로드립치고싶냐 0 7 시간 전 141
180596 [컴퓨터] 노트북 키보드 수리 맡기고 왔더니 팬이 엄청 돈당 4 신요조 0 7 시간 전 88
180595 [모바일] iptime wan 포트 연결안됨 해법 있을까요.. 1 비밀변호486 0 7 시간 전 37
180594 [컴퓨터] B650보드 추천좀 해주십시오 4 커뮤니티 0 8 시간 전 67
180593 [모바일] 아니 s21이 169g이고 s24u가 233g인데 말이되나 9 마법부오러사무국장 0 15 시간 전 292
180592 [잡담] 드디어 cpu 배송시작한다 9 차원에서사는인간 0 19 시간 전 313
180591 [컴퓨터] 다빈치 리졸브 쓰는분있나여 4 afterschool 0 21 시간 전 176
180590 [모바일] 아이패드 저장공간 질문 6 가나가다라 0 21 시간 전 178
180589 [컴퓨터] 150~200 4K 게이밍 견적 부탁 드려봅니다 11 라면死리 0 22 시간 전 182
180588 [잡담] sn850x 1tb 방열판 없어도 괜찮죠?? 10 김빵순 0 23 시간 전 126
180587 [컴퓨터] Am5 메인보드 asrock b650m pg lightning vs gigabite b650m-k 8 죽업 0 1 일 전 98
180586 [모바일] s21 3년째쓰다가 s24 울트라로바꾸고 느낀점 5 마법부오러사무국장 0 1 일 전 615