인프런 커뮤니티 질문&답변

픽린님의 프로필 이미지
픽린

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.6 입력 확인하기

(13:05) 콘솔 창에 숫자와 문자를 섞어 입력했는데, 정상적으로 받아들입니다.

작성

·

802

0

교수님께서 진행하신 코드 그대로 잘 이해하며 작성해왔습니다. 콘솔창에 실행하려보니 완전한 숫자가 아닌, 숫자와 문자가 섞여있는 9094h를 입력했음에도 정상적으로 정수로 받아들이고, OK. Thank you.까지 출력하던데, 왜 그런 것일까요..?
※a3432를 입력했을 때는 정상적으로 다시 숫자를 입력하라는 메세지를 출력했습니다.

https://inflearn.com/questions/643353
제 질문과 유사한 질문글을 참고하였음에도 아직 이해가 되질 않습니다. 왜 %ld가 숫자 뒤의 '문자'도 숫자로 인식하는건가요?
숫자 뒤 문자는 char타입으로 받아들여 숫자라고 인식하는건가요?

isdigit( )함수를 사용하라고 말씀하셨는데, %ld와 차이를 모르겠습니다.
%ld는 (숫자가 포함되어있다는 가정 하에) char타입도 숫자로 인식하는게 아닐까 싶습니다. 그렇다면, a3432의 경우는 왜 정상적으로 인식하는지 모르겠습니다..

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

long get_long(void);

int main()

{

printf("Please input a integer between 1 and 100.\n");

long number = get_long();

if (number > 1 && number < 100)

printf("OK. Thank you.\n");

else

printf("Wrong input.\n");

 

return 0;

}

long get_long(void)

{

printf("Please input an integer and press enter.\n");

long input;

char c;

while (scanf("%ld", &input) != 1)

{

printf("Your input - ");

while ((c = getchar()) != '\n')

putchar(c); //input left in buffer

printf(" - is not an integer. Please try again.\n");

}

printf("Your input %ld is an integer. Thank you.\n", input);

}

답변 2

0

픽린님의 프로필 이미지
픽린
질문자

image자세한 설명 감사합니다.
인터넷에서 suffix에 대한 개념을 찾아봐도 아직 잘 모르겠습니다..ㅠㅠ
예전에 강의에서 코드 작성 창에서 float형 자료의 경우 값을 대입할 때, 뒤에 f를 입력해줬던 것이 접미사(suffix)의 개념이었다는 것은 인지하고 있으나, (+작성한 코드를 빌드 시 컴파일러가 suffix로 인식한다는 것으로 이해하고 있습니다.)
콘솔 창에서 입력한 9094h의 경우 여기서 h가 suffix로 인식된다는 것은 잘 이해가 되질 않습니다.
------------------------------
다만, 제가 그 다음 강의 8.7 입력스트림과 숫자 를 듣고 이해하기로는, 위에 첨부한 사진의 콘솔 창 실행 결과와 같이 숫자+문자의 경우
ex) 9094h를 콘솔창에 입력했다고 가정하겠습니다.
get_long함수 내에 있는, (빈칸을 '입력을 다 완료했구나'라고 인지하는) scanf함수가 맨 처음 숫자 9094를 정상적으로 숫자로 받아들입니다. → 따라서 "Your input 9094 is an integer. Thank you." 라고 출력

그 다음
(숫자와 문자 사이 빈칸이 있든 없든 간에:
12321 dfasd처럼 빈칸이 있다면 scanf함수가, '입력이 완료됐구나' 라고 인지할 것이고/
9094h와 같이 빈칸이 없다면 문자를 인식하여 '숫자가 아니네, 입력이 완료됐구나' 라고 인지할 것입니다)
※사실 나중에 인식되는 '문자'를 char타입으로 받아들여 이것을 ASCII Code를 통한 숫자로 변환이 가능하지 않을까 싶기도 하지만, 애초에 형식 지정자를 %ld로 입력했을 때, 숫자+문자의 경우는 맨 처음 이미 숫자가 정상적으로 입력이 된 상태인데, 문자 입력이 들어왔다면? 이것을 컴파일러가 (문자→숫자 변환과정을 적용할 수 없는) 정상적이지 못한 '숫자입력을 끝내는' 신호라고 받아들일 것이라고 생각합니다. [문자+숫자의 경우 처음 입력되는게 '문자'이기에 말씀하신 것처럼 처음부터 입력서식이 맞지 않아 정상적으로 입력x]
: 따라서 '정상적으로 입력되지 못한' 숫자+문자에서의 뒤 문자는 버퍼에 저장이 되었다가,
"Your input - h - is not an integer. Please try again."를 출력할 것입니다.

앞 강의에서 이해한 내용을 바탕으로 작성하다보니 글이 너무나 길어졌는데, 시간이 걸리더라도 차분히 읽어봐주셔서 제가 완벽히 이해한 것인지... 확인해주신다면 정말 감사하겠습니다.
image
※※※ 제가 처음 드린 질문에서 9094h 입력에 대해 콘솔창이 "Wrong input. Please try again"를 출력하지 않은 것은, get_long함수에서 마지막에 input을 리턴하지 않았기 때문입니다..ㅠㅠ
문제 파악을 헷갈리게 해드린 것 같아 정말 죄송합니다...ㅠㅠ

음..

접미사(suffix)는 상수 뒤에 붙여 리터럴의 형을 특정짓는 방법입니다.

제가 첨부해드린 오류는 그 접미사가 사전에 정의되지 않았다고 발생한 오류이지요.

test2.c:6:22: error: invalid suffix "ab" on integer constant

6 | long int a = 1234ab;

| ^~~~~~

그러니까,

숫자+문자의 조합은 컴파일러가 숫자 자료형 뒤에 붙은 리터럴로 간주한다는 것이 제 말의 의미였습니다.

그래서 invalid suffix (부적절한 접미사)라는 에러가 뜬 것이구요.

말씀해주신 아래의 이야기도 유의해서 읽어보았는데요,

근본적인 이야기가 빠졌습니다.

scanf가 문자로 입력받을지 숫자로 입력받을지가 입력 서식을 통해 지정이 되는 것입니다.

가령 문자를 9094h를 입력받을때 scanf가 혼자 알아서 h를 '숫자가 아니네, 입력이 완료됐구나'라고 인지하지는

않는다는 것이지요.

(이 경우 'suffix가 있네? 근데 내가 못알아듣는 suffix네?' 하고 에러를 내보낼거에요)

0

안녕하세요,조금 더 자세히 말씀드리겠습니다

a3432의 경우 제대로 인식된 것이 아닙니다!

scanf("%ld", &input) != 1

이 부분을 잘 살펴보시면 되는데요

scanf는 입력 서식에 맞게 성공적으로 읽어들인 값의 개수를 반환하게 됩니다.

직접 결과를 확인해보세요.

#include <stdio.h>

int main()
{

	long int a;
	long int result = scanf("%ld", &a);
	printf("scanf result: %ld\n", result);

	return 0;
}

 

그래서 문자+숫자 조합으로 입력하였을 때 애초에 입력 서식이 맞지 않아

0을 반환하게 된 것입니다.

 

그리고 숫자+문자 조합, 그러니까 질문의 예시의 경우 9094h 와 같은 경우

컴파일러는 뒤의 숫자를 suffix로 인식합니다.

(그래서 숫자 끝에 붙어 있는 문자의 경우

"... is not an integer. Please try again" 문구에 출력되지 않는 것이지요.)

위 예시 코드에 a에 1234ab 등을 넣고 출력해보시면 바로 확인할 수 있을 거에요.

test2.c:6:22: error: invalid suffix "ab" on integer constant

    6 |         long int a = 1234ab;

      |                      ^~~~~~

 

추가적인 질문이 있다면 답글 달아주세요

 

픽린님의 프로필 이미지
픽린

작성한 질문수

질문하기