문제는 풀었지만 물어볼데가 없어서 여쭈어 봅니다.
정답코드중 일부분 이해되지 않았던 부분만 올려봅니다.
for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
scanf("%s %d", p[i]->name, &(p[i])->age);
getchar();
}
제가 이 코드에서 단 한가지 때문에 한시간 넘게 해결을 못했었습니다. 그 부분은 위의 정답코드중 일부분과는 다르게..
scanf("%s %d ", ......) 입력창에 %d 이후 한칸의 공백을 남겨두었었습니다. 그래야만 올바르게 반복문을 돌 동안 한사람의 정보가 입력된 이후 한칸 옆으로 간 뒤에 입력을 받을 것이라고 생각했었기 때문입니다. 근데 이렇게 하니까 계속 주구장창 오류가 나더군요. 버퍼에 대한걸 아직 이해를 못하고 있는거 같아서 틀린거 같은데 왜 이 공백하나가 오류를 나게 하는지 아직도 이해가 되질 않네요.
그리고 문자열 입력 후 숫자를 입력 받아서 getchar(); 또는 fflush(stdin); 으로 입력버퍼를 처리 해줘야 다음 반복에서 무리 없이 입력이 될거라 생각했는데 또 의외로 없이도 돌아가더군요. 이것도 왜인지 모르겠습니다..
또한 int형으로 포인터 배열을 사용하여 입력 받을때
&(p[i])->age == &p[i]->age == &(p[i]->age) 셋 다 돌아가긴 하는데 이론적으로도 셋다 올바른 표현인가요?
끝으로 파이썬에서는 print 함수 이후 자동 줄바꿈이 되는데
C언어에서는 어떤 경우에 자동줄바꿈이 되나요?
이 심사문제를 풀면서도 puts("");를 반복문 이후에 썼는데 없이 돌려봐도 자동으로 줄바꿈이 되더군요. 가끔은 불필요할때에도 넣는거 같아서 질문드립니다. ㅜㅜ 질문이 너무 많아서 죄송합니다.
답변 꼭 좀 부탁드릴께요!
문제는 풀었지만 물어볼데가 없어서 여쭈어 봅니다.
정답코드중 일부분 이해되지 않았던 부분만 올려봅니다.
for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
scanf("%s %d", p[i]->name, &(p[i])->age);
getchar();
}
제가 이 코드에서 단 한가지 때문에 한시간 넘게 해결을 못했었습니다. 그 부분은 위의 정답코드중 일부분과는 다르게..
scanf("%s %d ", ......) 입력창에 %d 이후 한칸의 공백을 남겨두었었습니다. 그래야만 올바르게 반복문을 돌 동안 한사람의 정보가 입력된 이후 한칸 옆으로 간 뒤에 입력을 받을 것이라고 생각했었기 때문입니다. 근데 이렇게 하니까 계속 주구장창 오류가 나더군요. 버퍼에 대한걸 아직 이해를 못하고 있는거 같아서 틀린거 같은데 왜 이 공백하나가 오류를 나게 하는지 아직도 이해가 되질 않네요.
scanf에서 정의한 입력 서식과 정확하게 일치해야 합니다. 끝에 공백을 추가했다면 입력도 끝에 공백을 추가해야 합니다.
숫자 두 개를 입력 받을 때 "%d %d"로 서식을 지정하면 "숫자 공백 숫자"로 입력을 받겠다는 뜻이 됩니다.
10 20
이렇게요.
"%d, %d"로 서식을 지정하면
10, 20
이렇게 입력받겠다는 뜻입니다.
"%4d-%2d-%2d"로 서식을 지정하면
2020-01-13
같이 입력을 받겠다는 것입니다.
강제는 아니어서 입력 값이 "123456-7-8"이 되면 잘못된 값이 입력되므로 에러를 빨리 찾아낼 수 있습니다.
그리고 문자열 입력 후 숫자를 입력 받아서 getchar(); 또는 fflush(stdin); 으로 입력버퍼를 처리 해줘야 다음 반복에서 무리 없이 입력이 될거라 생각했는데 또 의외로 없이도 돌아가더군요. 이것도 왜인지 모르겠습니다..
<C 언어 코딩 도장>에서 UNIT 85.20을 읽으세요. 그러면 해결됩니다.
fflush(stdin)은 임시 방편이고, 올바른 해결법을 배우세요.
또한 int형으로 포인터 배열을 사용하여 입력 받을때
&(p[i])->age == &p[i]->age == &(p[i]->age) 셋 다 돌아가긴 하는데 이론적으로도 셋다 올바른 표현인가요?
UNIT 25의 연산자 우선순위를 살펴보세요.
괄호를 쓰지 않아도 연산자 우선순위 때문에 문제없이 동작합니다.
끝으로 파이썬에서는 print 함수 이후 자동 줄바꿈이 되는데
C언어에서는 어떤 경우에 자동줄바꿈이 되나요?
이 심사문제를 풀면서도 puts("");를 반복문 이후에 썼는데 없이 돌려봐도 자동으로 줄바꿈이 되더군요. 가끔은 불필요할때에도 넣는거 같아서 질문드립니다. ㅜㅜ 질문이 너무 많아서 죄송합니다.
답변 꼭 좀 부탁드릴께요!
자동 줄바꿈이 없어야 하는 경우도 많습니다. 자동 줄바꿈이 있는 함수가 반드시 편하다고 할 수는 없습니다. 파이썬도 print 함수가 줄바꿈을 하지 않게 바꿀 수 있습니다. 자세한 건 <파이썬 코딩 도장>을 참고하세요.
하지만 반복문 내에서 입력을 한사람씩 받는 형태라
"%d %d_ " <-- 이와같이 일부로 공백을 하나 주었던 거였습니다.
입력: 홍길동 33 장길산 42 임꺽정 39 ....
한사람의 이름과 나이가 입력되고 같은 줄에 다시 한칸을 띄우고 입력을 하기 때문에 저렇게 했었는데 에러가 나던거라 이에 대한 의미는 잘 모르겠네요. 루프가 한번 돌면 자동으로 한칸을 띄우고 입력을 받는건지요..?
문제를 보면 한 줄에 입력받습니다.
박제가 30 서유구 16 박지원 43 홍대용 49 정약용 18
그러니까 scanf는 1번만 쓰라는 뜻입니다.
scanf("%s %d %s %d %s %d %s %d %s %d", ...)
이걸로 끝입니다.
반복문을 통해 scanf를 여러 번 쓰는 문제였다면 문제의 입력 형식이 다음과 같이 제시되었을 겁니다.
박제가 30이 경우 숫자 뒤에는 공백이 없습니다.
서유구 16
박지원 43
홍대용 49
정약용 18