gofkdvjvl   4년 전

제 방식대로 풀어보고 싶어서 난리치고 있는데 백준에서는 런타임 에러때문에 아예 돌아가지 않네요 ㅠㅠ 

clrmt   4년 전

제가 수업중이라 확인이 힘든데 scanf   .c_str이 정상적으로 돌아가는지 봐 주세요

gofkdvjvl   4년 전

댓글 감사합니다 이부분이 문제가 맞긴한데 왜 문제가 됐는지는 모르겠어요 ㅠㅠ 

그냥 cin 입력으로 하면 되긴 하더라구요 

djm03178   4년 전

원래 string형에는 scanf로 입력을 받으면 안 됩니다. 반드시 그 객체와의 올바른 상호작용을 통해 받아야 합니다.

단순히 c_str()를 넘겨주는 것은 그 객체가 문자열을 실제로 담고 있는 주소를 주는 것 뿐이고, 그 주소로부터 몇 바이트가 실제로 할당되어있는지 같은 건 scanf가 모릅니다. 그저 그 위치에 문자열을 쭉 저장할 뿐입니다. 할당된 메모리를 넘어서 scanf가 저장할 수도 있습니다. 뿐만 아니라 string 객체는 자기는 문자열을 받은 적이 없으니 size나 capacity도 전혀 변화시키지 않을 것입니다.

gofkdvjvl   4년 전

감사합니다 

문제가 꽤 많았네요 c_str로 해결할 수 있을 줄 알았어요 cin 입력이 생각보다 시간이 많이 잡아먹으니까 되도록 안쓰려 했었거든요 


만약 문자로 구성된 이차원 배열을 받고 싶다면 c++ string으로 선언해서 cin으로 한 줄씩 받는 거 외에는 답이 없나요?? 

c언어로 scanf("%c",&a[i]); 이런식으로 하면 엔터도 입력에 들어가는 것 같은데 한 줄 입력받고 뒤에 getchar()로 받아줘도 한 줄씩 밀리더라구요.. 

제가 잘못이해했을 수도 있구요 

매번 문자로 된 배열에서 입력부분에서 막힙니다 ㅎㅎ ㅠㅠ 

djm03178   4년 전

string 대신에 char 배열을 쓰면 됩니다. 그러면 scanf("%s")로 입력받을 수 있습니다.

그리고 cin이 느린 건  https://www.acmicpc.net/problem/15552 를 참고해서 빠르게 만들 수 있습니다.

djm03178   4년 전

scanf("%c",&a[i]); 가 한 줄씩 밀리는 건 아마도 맨 처음 줄 수를 scanf("%d")로 입력받은 직후에 남은 개행 문자를 먼저 제거해주지 않아서일 것으로 추정됩니다.

gofkdvjvl   4년 전

아하 맨 처음에 n을 입력받고 개행 문자를 제거 안해줬기 때문이군요 계속 배열 입력만 수정했었네요 

char 배열 같은 경우 char a[101][101];

이런 식으로 선언하고  

for(int i=0;i<n;i++){

scanf("%s",a[i]);

}

이렇게 입력받는 것이 맞을까요?? 

답변 주셔서 감사드립니다 

djm03178   4년 전

네, 그러면 됩니다.

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