정말 수준 낮은 질문인데요...

익명 사용자의 이미지

#include <turboc.h> // 사칙연산기
 
int main()
{
 
    int a, b, c;
    char cal;
 
    for (;;) {
        printf("계산을 할 수를 입력하세요.(단 정수만 가능)\n");
        printf("첫번째 수 : ");
        scanf("%d", &a);
        printf("두번째 수 : ");
        scanf("%d", &b);
 
        printf("연산자를 입력해주세요.\n");
        printf("※ 가능한 연산자 : +,-,*,/\n"); 
        scanf("%c", &cal);
 
        switch (cal) {     
 
            case '+':
            c = a + b;
            break;
 
            case '-':
            c = a - b;
            break;
 
            case '*':
            c = a * b;
            break;
 
            case '/':
            c = a / b;
            break;
        }
        printf("%d %c %d = %d 입니다.\n", a, cal, b, c); 
    }
}
 

이걸 컴파일 해서 실행시키면

연산자를 입력받는 부분부터 이상하게 되더라구요.

잘못된 부분이 어딘지 도저히 모르겠습니다.

무지렁이 하나 구해주신다고 생각하시고 알려주시면 감사하겠습니다.

kgcrom의 이미지

cal을 받기전에 getchar하셔요.
구글에 "scanf 개행"이라고 검색하시면 왜 그런지 알수잇습니다

흘러가고있는 지금 이 시간에 충실하자.

익명 사용자의 이미지

scanf("%c", &cal);을

cal = getchar();로 바꾸어도 실행 결과는 동일한데요.

좀 더 구체적으로 실행 결과를 말씀드리면

두번째 숫자 입력후

연산자 입력을 받지 않고

첫번째 숫자가 출력되고 루프로 넘어갑니다.

이거 어떻게 해결 하죠?

김정균의 이미지

구글 검색을 해 보셨으면 이해하셨을텐데요. scanf가 개행(\n)을 읽어들이기 때문에 b의 값에는 숫자가 들어간 것이 아니라 개행이 들어가 있다는 의미입니다. 그러니 cal에는 b에 들어가야 할 값이 들어가는 거죠.
그래서 위의 분의 답변은 scanf를 getchar로 변경하라는 것이 아니라 scanf를 한 후에, getchar로 개행을 읽어줘야 님의 루틴이 정상적으로 작동한다는 것을 의미합니다.

그래서 다음과 같이 만들 수도 있습니다.

retry:
    char s[1024] = { 0, };
    printf("계산을 할 식을 입력하세요. (단 정수만 가능)\n");
    if ( fgets (s, 1023, stdin) == NULL ) {
        printf ("식이 올바르지 않습니다. 다시 입력 하세요\n");
        goto retry;
    }
 
    sscanf (s, "%d %c %d", &a, &cal, &b);