ccdl1217_bac   2년 전

preview

질문 1. scanf는 for로 구현할 수 없나요?

5 4

1 2 3 4 를 입력하면

012(확인용)

으로 출력됩니다. 

for를 통해 scanf로 1개씩 받아들이면, 1 02 13 2이렇게 출력되어야 한다고 생각했는데 하나씩 입력받는게 불가능한가요?

질문2. a[10000]으로 설정한 이유가 a[num]이 불가능해서 이렇게 설정했습니다. 집합을 미지수에 따라 크기를 다르게 설정할 수 있는 방법이 있을까요??

읽어주셔서 감사합니다. 답변 부탁드립니다. 감사합니다!!

naangel0515   2년 전

질문 1. For문 안의 scanf에서 띄어쓰기를 빼면 가능합니다.

          scanf(“%d ”, &a[i]) -> scanf(“%d”, &a[i]);

질문 2. malloc 이라는 동적할당 방법을 배우면 가능합니다. C++을 배우시면 vector를 사용하는 방법도 있습니다.

도움이 되었으면 좋겠네요

kipa00   2년 전

  1. 가능은 합니다만, 일반적인 scanf 등의 입력 방법으로는 불가능하다고 생각하시면 됩니다. 왜냐하면, 표준적인 입력에서는 오타 교정 등을 목적으로 Enter 키를 입력할 때까지 추가적인 처리가 보류되기 때문입니다. (Enter 키는 그래서 Enter입니다! 입력을 확정하고 프로그램 실행 구문으로 들어간다는 의미입니다.) Windows 콘솔에서 이 과정을 무시하고 이런 입력을 꼭 구현해야겠다 싶으시면 conio.hgetchkbhit 등의 비표준 함수를 참고하세요. 이 함수를 사용하는 경우 숫자 입력 등을 직접 구현하셔야 합니다. PS를 하는 데에는 굳이 이렇게 구현할 필요는 없습니다.
    별개로 scanf의 공백 문자에는 의미가 있습니다.
    • Whitespace character: the function will read and ignore any whitespace characters encountered before the next non-whitespace character (whitespace characters include spaces, newline and tab characters -- see isspace). A single whitespace in the format string validates any quantity of whitespace characters extracted from the stream (including none).
    포맷 문자열에 %c를 포함하지 않는 이상 이 문자는 완전히 무의미하고 추가적인 syscall을 불러일으킬 수 있으므로, 분명한 의도가 없는 한 scanf에서는 띄어쓰기를 완전히 제거하시는 것이 좋습니다.
  2. 제시하신 문법은 가변 길이 배열(VLA)이라고 부르는 문법으로, C99에 들어왔다가 C11에서 선택 구현사항으로 바뀌었습니다. C++17은 C11을 반드시 구현해야 하기 때문에, 사용하시는 컴파일러에 따라 C++17을 사용하시는 경우 이 가변 길이 배열을 이용할 수 있습니다. gcc와 clang에는 구현되어 있으니 백준에서는 마음 놓고 사용하셔도 됩니다.
    로컬에서 컴파일이 되지 않는 이유는 따라서 너무 많습니다. 컴파일러로는 MSVC를 사용 중이신 것 같은데, 이 컴파일러가 C++17/C99을 지원하지 않을 수도 있고, 아예 C11의 VLA를 구현하지 않았을 수도 있습니다. 이 과정에 대해 디버깅이 필요하시면 C++ VLA 등의 키워드로 검색해 보시기 바랍니다.
    지원이 안 되는 경우, C에서는 malloc/calloc 등의 동적 할당, C++에서는 newdelete를 이용한 동적 할당을 사용할 수 있습니다. STL container를 더 선호하신다면 std::vector 등을 이용할 수도 있습니다. C++에서는 둘을 섞어서 2차원 배열을 할당하는 것도 가능합니다. (vector<_T> *arr_2d = new _T[row_size] (col_size);)

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