2017-02-14 3 views
-2
int main(){ 
    char c; 
    scanf("%c", &c); 
    printf("%d\n", c); 
} 

사용자가 71을 입력하고 Enter 키를 누릅니다.2 자리 숫자의 Scanf 값은?

c71이되는 이유는 무엇이며, 이 아닌 1 만 읽는 이유는 무엇입니까?

+3

'char '이 무엇인지 아십니까? 단일 변수는 어떻게 두 개의 값을 가질 수 있습니까? –

+0

@EugeneSh., 예 a 문자 – Onedayanam

+1

그리고 두 개의 문자를 어떻게 포함 할 수 있습니까? –

답변

0

몇 가지 주요 차이점이 누락 된 것 같습니다.

scanf 함수는 입력 문자열을받습니다. 예 : '7'로

  • 인쇄용 글리프 또는 '1'또는 'G'
  • 제어 문자 등 개행 등 ("\ n을 '각 캐릭터는 8 비트 중 하나를 나타내는 정수이고) 또는 bel ('\ a')
  • 문자의 문자열 끝을 표시하는 데 사용되는 nul 터미네이터 (\0)입니다.

(단순화를 위해 ASCII로 가정합니다. 다른 인코딩을 사용할 수 있습니다.)

인쇄 가능한 문자는 인쇄 할 때 문자, 숫자 또는 기호로 화면에 나타납니다. 제어 문자는 터미널/디스플레이 장치가하는 것을 제어합니다 (줄 바꿈으로 개념적 커서를 다음 줄로 이동시키고 bel는 일부 터미널에서 신호음을냅니다).scanf 입력 문자의 문자열로 무엇을


은 형식 문자열에 의해 제어됩니다

  • %cchar 값으로 변환없이 들어오는 문자를 를 읽습니다.

  • %d은 '0'.. '9'(즉, 0x30..0x39 값) 범위의 문자 시퀀스를 정수로 변환합니다. 문자가 '7'%c 인 문자로 스캔 될 때

그래서,이 값 0x37 (55 진수) 여전히 가정 ASCII을 준다. 당신이 문자열 "71"를 스캔하려면 같은 문자가 %d와 정수로 스캔하면 정수 값으로, 정말 어떤 이유로 당신을 위해 %d (또는 %hhd 경우를 사용, 값 7

소요 그것을 char에 저장하고 싶다).


이제 마지막으로, 우리는이 댓글 해결할 수 있습니다 : 나는 5 자리의 정수를 스캔 할 수있는 방법, 정수는 4 바이트 인 경우 ...

를?

그런 다음 그 5 비 NUL 바이트가 기본-10로 변환됩니다, %d 이것을 스캔하는 경우의이

const char literal[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x00}; 

로 메모리에 저장됩니다 리터럴 문자열 "12345"를 생각해 보자 정수를 12345로 변경하십시오.

그러나 동일한 문자열을 %5c으로 스캔하면 {0x31, 0x32, 0x33, 0x34, 0x35} 값을 갖는 5 자 버퍼가 채워집니다. 일반 %c을 사용하면 0x31이라는 첫 번째 문자 만 읽습니다.

1

'7'은 문자이고 '1'은 문자입니다. 문자 'G'는 71 형 'G'의 진수 값을 가지고 있으며, 당신은 당신이 할 수있는 번호를 검색 할 경우에 당신은 (71)를 얻을 수 있습니다 :

int i; 
scanf("%d", &i); 
printf("Value %d = char(%c)", i, (char)i); 

'7'을 scanf와 시스템되면 기다리고 있던 하나의 캐릭터가 있었고 청취를 멈췄습니다. 당신의 '1'은 아직 "스캔"되지 않았습니다!

1

scanf ("%c", &c); 

수단 문 「표준 입력 한 바이트를 읽어 가변 c 넣 ". 변환이 수행되지 않습니다. 예제에서 바이트는 '7'입니다. ASCII (또는 UTF-8 같은 수퍼 집합) 문자 인코딩을 사용하는 로켈에서 프로그램이 실행된다고 가정하면 '\x37' 또는 55과 같습니다. c에 할당 된 값은 현재 로켈에서 사용하는 문자 인코딩에 따라 달라집니다. 비교함으로써

성명 등

scanf ("%d", &i); 

는 표준 입력 십진수를 나타내는 하나 이상의 문자 읽어 정수 값에 해당 진수로 변환하고, 변수에 그 값을 저장 "을 의미 i ". 변수 i에 할당 된 값은 현재 로케일에서 사용하는 문자 인코딩에 의존하지 않습니다. 단, 표준 입력은 프로그램에서 예상하는 인코딩을 사용합니다.

관련 문제