c언어 이론 고수님들 도와주십쇼 ㅠㅠ

c언어 이론 고수님들 도와주십쇼 ㅠㅠ

작성일 2024.05.18댓글 3건
    게시물 수정 , 삭제는 로그인 필요

//1번 코드
#include <stdio.h>
void reverseSentence();
int main(void) {
printf("문장을 입력하시오: ");
reverseSentence();
return 0; }

void reverseSentence() {
char c;
scanf("%c", &c);
if (c != '\n') {
reverseSentence();
printf("%c", c); }
}

//2번 코드
#include <stdio.h>
int main(void){
char c;
scanf("%c", &c); //실행시키고 문자 a를 입력
if(c=='a')
printf("성공");
return 0;
}

1번은 입력한 문자열을 거꾸로 출력하는
재귀호출을 이용한 코드입니다.

그런데 1번 코드를 보고 의문이 들어서요.
1번코드를 실행하고 문자를 하나 입력할 때마다
엔터키 누른 게 아니라면 if문에 조건에 들어맞게 되고
reverseSentence()함수를 다시 호출하여 scanf가 반복적으로 실행되는 구조이더라구요.

그런데 제가 알기론 scanf로 변수에 입력값을 저장하려면 엔터키를 눌러줘야 되는 걸로 알고 있는데 문자열을 입력하고 엔터를 한번만 눌러눠도 입력한 문자 하나하나에 대해 if문이 실행되는게 왜 그런가 싶어서요...

만약 엔터키를 안눌러도 변수에 입력한 값이 저장된다면 제가 작성한 2번 코드도 실행했을 때,
a만 입력하고 엔터키 안 눌러줘도 if문에 조건에 맞으니 "성공"을 출력해야 하는데 또 그렇지는 않더라구요...

왜 이런 현상이 scanf라는 함수에서 동시에 일어날 수 있는지 scanf의 원리에 대해 설명해주실 분을 구합니다.
컴공 1학년이라 쉽게 부탁드리겠습니다.
선배님들 ㅠㅠ



profile_image 익명 작성일 -

일반적으로는 숫자나 문자열을 입력받습니다.

이때는 %d %s 같은걸로 쓰지요.

글자단위로 입력받는 방법도 있습니다.

이게 %c

쓰인 %문자 d s c 를 보면 알겠지만 한글자 입력받는 c(char) 형태입니다.

d s 는 엔터가 들어올때까지 입력입니다.

c 는 글자도 입력, 특수문자도 입력, 엔터키도 입력

이런식으로 사용한다고 알고 있으면 됩니다.

profile_image 익명 작성일 -

키보드로 글자를 치면 입력 버퍼에 들어감.

scanf 는 키보드에서 입력을 직접 받는 것이 아니라, 입력버퍼에서 데이터를 가져오는 함수임.

scanf("%c", &c); 는

입력 버퍼에 데이터가 있으면, 입력을 기다리지 않고 입력 버퍼에서 문자 하나를 꺼내오고 함수는 곧바로 종료됨.

입력 버퍼에 데이터가 없으면, 입력 버퍼에 들어 온 문자가 '\n'이 될 때까지, 즉 마지막에 엔터를 칠 때까지 기다림. 그러므로 엔터를 쳐야 비로소 함수가 종료됨.

profile_image 익명 작성일 -

그런데 제가 알기론 scanf로 변수에 입력값을 저장하려면 엔터키를 눌러줘야 되는 걸로 알고 있는데 문자열을 입력하고 엔터를 한번만 눌러눠도 입력한 문자 하나하나에 대해 if문이 실행되는게 왜 그런가 싶어서요...

알고 있는 것이 맞습니다.

scanf() 함수는 기본적으로 '\n' 이 눌러 지기 전까지는 입력을 받지 못합니다.

예전에 getch() 라는 함수가 있었는데 이 함수는 가능했지만 지금은 지원하지 않습니다.

(Visual C++ 에서는 여전히 _getch() 함수가 있습니다. 호환성의 문제가 있기는 합니다만.)

프로그램이 실행될 때 키보드의 입력이 바로 프로그램으로 전달되지 않습니다.

키보드의 입력은 input queue(입력 버퍼) 에 저장이 됩니다.

(마찬가지로 출력도 바로 되는 것이 아니고 ouput queue에 저장이 됩니다.

시간 날때 이 queue에 있는 내용을 콘솔로 내보냅니다. 이것을 강제로 내보내게 하는 것이 flush() 입니다.)

scanf() 함수는 이 입력 버퍼에 값이 있을 경우 이것을 꺼내 옵니다.

예를 들어, 사용자가

C:> abc[Enter]

을 입력했다고 하면 입력 버퍼에

'a', 'b', 'c', '\n'

이 차례대로 입력되는 것이고 scanf() 함수는 이 것을 차례대로 꺼내 오게 됩니다.

당연히 queue이기 때문에 입력한 순서대로 꺼내오게 되죠.

지금, scanf("%c",...) 이므로 한 문자씩 꺼내오게 됩니다.

void reverseSentence() { char c; scanf("%c", &c); // 최초 입력할 때는 'a', 'b', 'c', '\n' 을 눌렀을 경우에만 // 다음으로 진행됩니다. 'a' 를 빼내고 이제 'b', 'c', '\n' 이 // 입력 버퍼에 저장되어 있겠죠. if (c != '\n') { // 방금 꺼내온 c 는 'a' 이므로 recursive 로 들어갑니다. reverseSentence(); printf("%c", c); } }
void reverseSentence() { char c; scanf("%c", &c); // 이제 2번째 호출인데, 지금 입력 버퍼에 'b', 'c', '\n' 이 들어가 있죠? // 그러니, 'b' 를 꺼내오고 그냥 다음으로 넘어 갑니다. if (c != '\n') { // 차례대로 진행해서 마지막에 '\n' 을 꺼내 오면 이제 이 문장은 거짓이 되어 // recursive 함수가 종료됩니다. reverseSentence(); printf("%c", c); } }

이런 식으로 동작합니다.

c언어 고수님들 도와주십쇼

... ㅠㅠ 도와주세요 고수님들.... int main(void) { int total = 0; char strtotal[50]; set_DDR(); //함수 호출 set_UART(); //통신 포트 설정 LED_OFF; _delay_ms...

고수님들 도와주십쇼~내공 드림^^

C언어로 방정식의 해를 구하는 프로그램을 작성해야 하는데 어떻게... ㅠㅠ 프로그램좀 작성해 주십쇼~ 고수님들~~ㅠ 급해요 ㅠ 문제는...

c고수님들~~쫌 도와주십쇼~~ㅠㅠ

c고수님들~~ 쫌 도와주십쇼~~ 재가 급해서그럼니다~~ㅠㅠ 재발~~ㅠㅠ플리즈~~ 2차원 배열을... 225 c언어로 위의 출력이나오도록 하면 됩니다...

c언어 고수님들 도와주십쇼..

... 알려주세요 ㅠㅠ 실기평가 if문의 조건적 실행을 이용해서 사칙연산을 취하는 프로그램을 작성하여라 조건 : if문 조건변수 opt 연산을 취할 두...

C언어 고수님들..좀 도와주십쇼

... Exellent!! Good Job!! ^^ \n"); else if(que<sol) printf(" UP !! UP!! UP!! ㅜㅜ \n"); else if(que>sol) printf(" DOWN !! DOWN !! DOWN!! ㅠㅠ \n"); } } }while(num!=2); return 0; }