질문글도 많이 올라오는데 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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180473 [컴퓨터] 올그떠 보인다길래 삭제함 Benetton 0 6 시간 전 72
180472 [잡담] wh xm4 끼고 자다가 오른쪽 박살남ㅠㅠ 3 곰문곰문곰문곰문... 0 6 시간 전 103
180471 [컴퓨터] 컴퓨터 완본체 샀는데 깔아야할 드라이버나 설정 있나요? 6 하이웨이 0 11 시간 전 169
180470 [잡담] 좆데온 8천번대보다 7900xtx가 2 전기모기채는신이야 0 11 시간 전 196
180469 [컴퓨터] 형님들 견적짠거 호환 문제없는지 확인 부탁드립니다 2 우루루옳지 0 11 시간 전 73
180468 [정보] 크러쉬80 - 레이니75를 만든 Wob의 텐키리스 키보드 2 Veigrake 0 12 시간 전 198
180467 [잡담] 여기 로봇 청소기도 물어봐도 됨?? 11 년째재수강 0 13 시간 전 183
180466 [잡담] 윈도우12 전부 레거시쳐낸다는말이 하드웨어를 말한거구나 4 이거보인다면기분탓임 0 13 시간 전 264
180465 [컴퓨터] 갤럭시80 넘나 이쁜것이예요 2 군마 1 16 시간 전 355
180464 [모바일] 차량용 맥세이프 충전기 탁상용으로 쓰니 좋다 4 년째군대 0 16 시간 전 193
180463 [잡담] 채터링 어캐잡습니까... 5 로우팡맨 0 17 시간 전 182
180462 [잡담] 4월에 마우스 큰 게 두 개 나오네 8 GNStout 0 17 시간 전 259
180461 [컴퓨터] 무선 키보드 마우스 세트는 별로인가? 3 하이웨이 0 17 시간 전 128
180460 [컴퓨터] 10만원대 포터블 모니터는 사는거 아니더라 15 코싸멘뚜 0 17 시간 전 229
180459 [정보] 레이니75 저격하는 브릿지75 19 Veigrake 0 19 시간 전 313
180458 [잡담] 드디어 왔다 레이니 5 ltearl 0 1 일 전 303
180457 [프로그래밍] 그 혹시 게임쪽 종사자 있음? 16 god79ii 0 1 일 전 445
180456 [컴퓨터] sata 케이블때문에 ssd가 망가질 수도 있나요? 9 드웨인토마스 1 1 일 전 330
180455 [모바일] 횽들 어거좀 봐줘 6 부자가될개붕이놈들 0 1 일 전 200
180454 [컴퓨터] 선생님들 혜안을 구합니다 9 빠른인정빌런 0 1 일 전 191