• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

버퍼 관련

23.03.15 16:27 작성 23.03.15 16:29 수정 조회수 457

1

2:30초 쯤에 관련된 질문입니다. 많은 질문들과 답변을 본 이후에도 확신이 가지 않는 부분들이 있어 질문드립니다.

Q1)

's' = 스페이스바

최초 A's'3's'3's'\n를 입력하게 되면

scanf의 경우 개행문자 즉, 공백을 만나는 순간까지만 변수에 저장하는 것으로 알고 있습니다.(이것 또한 맞는지 잘모르겠네요.)

그렇기 때문에 버퍼에

|A| |3| |3| |\n|가 입력되지만 마지막 3 이후에 's'에 의해 마지막 \n는 버려지고 마지막| |까지만 변수에 저장되는 것이 맞나요??

Q2)

Q1이 맞다면 처음 루프가 돌고 현재 버퍼에

| |가 남아 있는 상태에서 두번째 입력

B's'1's'2's'를 받게 되면 버퍼에

| |B| |1| |2| |가 버퍼에 남게 되는 것이 맞나요??

Q3)

Q2)가 맞다면 함수로 진입했을 때 cr에 해당하는 문자는 's' 즉, 공백이 되고 그 다음 변수 자리에 또 문자가 들어오기 때문에 새롭게 초기화 되지 않고 기존의 3, 3을 입력하게 되는게 맞는지, 이전의 's' 공백이 해결되고 다시 루프로 진입하여 그 전에 입력된 B 1 2를 처리하는 것인지 궁금합니다.

Q4)

추가로 scanf("%c%d%d")와 scanf("%c %d %d")의 차이도 궁금합니다. 또 버퍼에 문자들 사이사이에 's' 즉, 공백의 경우 어떻게 처리되는 건지 궁금합니다.

 

아직 초보자라 질문의 의도가 정확히 전달되지 않을 수 있을 것 같습니다 이해 안가시는 부분은 다시 한번 알려주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

3

Soobak님의 프로필

Soobak

2023.03.15

안녕하세요, 답변 도우미 Soobak 입니다. 😀

Q1.

  • scanf의 경우 개행문자 즉, 공백을 만나는 순간까지만 변수에 저장하는 것으로 알고 있습니다.(이것 또한 맞는지 잘모르겠네요.)
    -> 우선, 개행 문자('\n') 와 '공백' 은 정확히 같은 개념은 아닙니다.
    C언어에서 공백 문자(whitespace characters)는 주로 입력이나 출력에서 공간을 만들거나 구분하는 데에 사용 되는 문자들인데요, 스페이스(Space), ' ' , 탭(Tab), '\t' , 개행(Newline), '\n' , 수직 탭(Vertical tab), '\v' , 폼 피드(Form feed), '\f , 캐리지 리턴(Carriage Return), '\r' 모두 공백 문자 입니다.
    강의 7.8 단어 세기 예제10:45 부분의 isSpace() 함수와 관련된 교수님의 설명을 복습해보시는 것을 추천드려봅니다! 😀

    -> 또한, "scanf() 함수가 개행문자를 만나는 순간 까지만 변수에 저장한다" 는 것은 다소 애매한 문장인 것 같습니다. 질문해주신 강의의 3:53 부분과 같이, "%c" 서식 지정자를 사용하면 scanf("%c %d %d", &c, &rows, &cols) 처럼 개행 문자를 char 형 변수에 저장하고, 이어지는 서식 지정자들에 따라서 계속해서 변수에 값을 저장할 수 있기 때문입니다.

  • 그렇기 때문에 버퍼에 |A| |3| |3| |\n|가 입력되지만 마지막 3 이후에 's'에 의해 마지막 \n는 버려지고 마지막| |까지만 변수에 저장되는 것이 맞나요??

    -> 아닙니다. space 공백 문자에 의해 \n 문자가 버려지는 것이 아닙니다. 또한, 마지막 | | 라고 말씀해주신 부분이 's' 라고 표현해주신 공백(space) 를 말씀하시는 것이라면, 이 또한 변수에 저장되는 것이 아닙니다.
    강의에서의 scanf("%c %d %d", &c, &rows, &cols) 함수를 바탕으로 예시를 들어보겠습니다.
    질문자님이 말씀하신 A[공백]3[공백]3[공백]\n 을 입력한다면, 다음과 같이 처리가 됩니다.
    (1). 입력 버퍼에 "A[공백]1[공백]2[공백]\n" 이 담깁니다.

    (2). %c 서식 지정자로 인해 첫 번째 문자 첫 번째 문자 A 를 읽고 c 변수에 저장합니다.

    (3). 공백문자(space) 를 건너 뛰고 %d 서식 지정자로 인해 1 을 읽어 rows 변수에 저장합니다.

    (4). 공백문자(space) 를 건너 뛰고 %d 서식 지정자로 인해 2 를 읽어 cols 변수에 저장합니다.

    (5). 이후 입력 버퍼에는 [공백]\n 이 남아있습니다.
    다만, 질문해주신 강의에서는 교수님께서 "A[공백]1[공백]2\n" 과 같이 입력하시므로, 최종적으로 입력 버퍼에 '\n' 이 남아있는 것이며, 이를 처리하기 위해 while(getchar() != '\n') continue; 구문을 추가해주는 것입니다.

Q2.

  • Q1이 맞다면 처음 루프가 돌고 현재 버퍼에 | |가 남아 있는 상태에서 두번째 입력 B's'1's'2's'를 받게 되면 버퍼에 | |B| |1| |2| |가 버퍼에 남게 되는 것이 맞나요??
    -> 아닙니다. Q1 에서 설명드린 내용을 참고하시면, 아닌 이유를 충분히 이해하실 수 있으실 것이라 생각됩니다. 만약 이해가 되지 않으신다면, 편하게 추가 질문을 남겨주시면 감사하겠습니다. 😀

Q3.

  • Q2)가 맞다면 함수로 진입했을 때 cr에 해당하는 문자는 's' 즉, 공백이 되고 그 다음 변수 자리에 또 문자가 들어오기 때문에 새롭게 초기화 되지 않고 기존의 3, 3을 입력하게 되는게 맞는지, 이전의 's' 공백이 해결되고 다시 루프로 진입하여 그 전에 입력된 B 1 2를 처리하는 것인지 궁금합니다.

    -> 아닙니다. Q2 에서 답변드린 내용을 바탕으로 참고 부탁드리겠습니다. 이 부분도 만약 이해가 어려우시다면 추가적으로 편하게 질문 남겨주시면 감사하겠습니다. 😀

Q4.

  • 추가로 scanf("%c%d%d")와 scanf("%c %d %d")의 차이도 궁금합니다.

    -> scanf("%c%d%d")scanf("%c %d %d") 의 경우에서는 차이점이 없습니다. %d 서식 지정자는 공백 문자를 자동으로 건너뛰기 때문입니다.
    하지만, 제가 생각하는 질문자님의 질문 의도는 "각 서식 지정자들 사이의 공백 문자 유무로 인해 차이점이 존재하는 지"에 대한 것이라고 생각하여, "차이점이 존재한다" 는 점을 아래 예시를 바탕으로 설명드리도록 하겠습니다.
    예를 들어, scanf("%c%c%c")scanf("%c %c %c") 의 경우를 살펴보겠습니다.
    %c 서식 지정자는 공백 문자를 포함한 모든 문자들을 읽습니다. 따라서, 서식 지정자 사이에 공백 문자를 추가하면, 차이점이 생깁니다.
    예시로 "A B C\n" 를 입력한다고 가정해보겠습니다.
    (1) scanf("%c%c%c") 를 사용하는 경우
    : 이 경우, 첫 번째 문자 'A' 가 첫 번째 서식 지정자 %c 로 읽히고, 공백 문자(space) 가 두 번째 서식 지정자 %c 로 읽힙니다. 그 다음, 'B' 가 세 번째 서식 지정자 %c 로 읽힙니다. 따라서, 입력 버퍼에 'C'\n 이 남게 됩니다.

    (2) scanf("%c %c %c") 를 사용하는 경우
    : 이 경우, 첫 번째 문자 'A' 가 첫 번째 서식 지정자 %c 로 읽히고, 공백 문자가 건너뛰어집니다. 그 다음 'B' 가 두 번째 서식 지정자 %c 로 읽히고, 다시 공백문자가 건너뛰어집니다. 마지막으로, 'C' 가 세 번째 서식 지정자 %c 로 읽힙니다. 따라서, 입력버퍼에는 \n 만 남게 됩니다.

  • 또 버퍼에 문자들 사이사이에 's' 즉, 공백의 경우 어떻게 처리되는 건지 궁금합니다.

    -> 위에서 설명드린 것처럼, 어떠한 서식 지정자를 사용하는지에 따라서 처리가 달라지게 됩니다.


최대한 질문자 님의 질문 의도를 이해하려 노력해보고, 꼼꼼하게 답변 드리고자 노력해보았습니다. 그럼에도 불구하고, 만약 질문자님의 질문 의도와 답변이 일치하지 않는 부분이 있다면, 편하게 추가적으로 질문 남겨주시면 감사하겠습니다. 😀
부디 답변이 되셨길 바라며, 꼼꼼하게 학습하시는 모습이 참 멋있으십니다. 어려우신 점이 있으시다면, 언제든지 편하게 질문 남겨주세요. 화이팅!! 👍👍

BBBBB님의 프로필

BBBBB

질문자

2023.03.19

답변을 확인만하고 깜빡하고 답변을 못드렸습니다 죄송합니다. 구체적인 답변 덕분에 궁금증이 한 번에 해결되었습니다. 자세하고 이해가 쉽게 설명해 주셔서 감사합니다!

Soobak님의 프로필

Soobak

2023.03.19

에고, 답변이 도움이 되셨으면 추가적으로 댓글 달아주지 않으셔도 괜찮습니다!!😀 질문자님께서 궁금증이 풀리셨으면, 이어서 학습을 진행하시는 것이 더 중요하니까요! 그럼에도 불구하고, 솔직히,, 댓글 남겨주시니까 뿌듯하고 힘이 나네요!! 😁😁 궁금증이 잘 해결되셔서 참 다행이에요! 좋게 말씀해주셔서 저도 감사드리고, 앞으로도 궁금하신 점 있으시면 언제든지 편하게 질문 남겨주세요! 화이팅!