his130   6년 전

string s;

//cin >> s;
scanf("%s", s);
calc(s);


평소에 cin,cout 을 쓰다가 속도 때문에 scanf 로 바꾸려고 하는데요..

cin 은 오류가 안 나는데

scanf 왜 저렇게 쓰면 오류가 나는 건가요?

gaelim   6년 전

scanf 로는 string 객체를 인자로 받지 못하지 않을까요?

djm03178   6년 전

scanf에 %s를 쓰는 건, scanf에 전달해 준 주소값의 그 위치부터 차례대로 문자들을 써넣으라는 의미입니다.

그런데 string이라는 건 객체입니다. char형 배열처럼 단순히 1바이트씩 쓰면 그만인 게 아니라는 뜻입니다. 내부적으로 char형 포인터도 가지고 있지만 그 외에 다른 정보들도 가지고 있을 수 있으며 string이 뭔지도 모르는 scanf한테 전달해주면 무슨 일이 생길지는 알 수가 없습니다.

반면에 cin >> s 은 cin이라는 객체가 string 객체를 인자로 받을 수 있는 >> 연산자에 대한 구현이 되어 있기에 가능한 것입니다. 단순히 scanf처럼 1바이트씩 뭐가 있는지도 모르는 주소에 써내려가는 것과는 전혀 다른 동작입니다.

his130   6년 전

감사합니다. 그렇다면 혹시 제가 string 을 scanf 로 쓰고 싶으면

char[30] 이런식으로 써야 하나요?

근데 제가 이렇게 쓰는걸 망설였던게

만약 char[30] 배열에 AAA만 넣고싶으면 나머지 27개는 어떻게 되는건가요?

NULL형으로 되는건가요?

동적으로 쓰고 싶다면 어떤 방식이 있을까요?

jh05013   6년 전

참고로 sync_with_stdio(false)와 cin.tie(NULL)을 한 상태의 cin이 scanf보다 빠릅니다.

https://www.acmicpc.net/blog/v...

djm03178   6년 전

char s[30];

scanf("%s", s);

s가 지역 변수라면, 배열 안의 내용은 초기화가 안 되어 있습니다.

따라서, AAA를 입력받았다면 s의 내용은 'A', 'A', 'A', '\0', 그 이후로는 모두 값을 알 수 없는 상태가 됩니다.

s가 전역 변수라면, 모든 내용이 0으로 초기화가 되어 있으므로 나머지 부분에도 모두 '\0'이 들어가 있습니다.

동적으로 쓰려면, 우선 큰 배열에 입력받아놓고 그 길이를 strlen으로 조사해서 다시 그 크기만큼을 다른 포인터에 동적할당한 다음 strcpy로 복사하는 방법이 있겠죠.

cheetose   6년 전

char temp[1001];

scanf("%s",temp);

string s=temp;

저는 이런 식으로 합니다

his130   6년 전

훌륭한 답변해주셔서 너무나 감사합니다!

his130   6년 전

추가적으로 만약

sync_with_stdio(false)와 cin.tie(NULL) 를 쓴다면

메인함수 안에서 한번만 선언하면 되는 건가요?

djm03178   6년 전

네 한 번만 쓰면 프로그램이 끝날 때까지 적용됩니다.

his130   6년 전

네! 죄송한데

변수처럼 메인에서만 작동하는건가요? 

아니면 전역처럼 메인 위에 해야 전체 프로그램에서 작동될까요..?

djm03178   6년 전

전역으로 할 수 있는 게 아니죠. 이건 선언이 아니고 함수 호출이니까요.

printf를 전역에 해도 되냐고 묻는 거랑 같습니다.

his130   6년 전

아 그렇군요 감사합니다!

댓글을 작성하려면 로그인해야 합니다.