2012-08-15 5 views
1

어떻게 putchar의 도움으로 정수를 인쇄 할 수 있습니까? 나는 외부 저장 장치를 사용하지 않고 그것을하고 싶다.
이 질문은 작년 인터뷰에서 질문되었습니다.putchar은 정수를 출력 할 수 있습니까?

+1

Btw,이 인터뷰 담당자가 2013 IOCCC 준비 중이라고 생각 했습니까? –

+0

"외부 저장소를 사용하지 않고"는 무엇을 의미합니까? –

+1

@MichaelBurr 나는 면접관이 변수를 사용하지 않는다는 것을 의미한다고 생각합니다. 나는 혼란 스럽습니다. – akash

답변

1

itoa 함수 (라이브러리를 가져와야 함)를 생성 한 다음 생성 한 cstring의 각 문자를 반복 (이 루프의 상한을 얻기 위해 strlen을 사용) 한 다음 각 문자에 단순히 putchar()을 사용하는 것을 고려하십시오.

+0

putchar 만 언급되었습니다. – akash

+0

출력 또는 외부 라이브러리 참조를 위해 특별히 "putchar"을 의미합니까? 나는 전직을 추측했다. – mjgpy3

+0

itoa는 외부 메모리 인 – dvvrd

5

인터뷰에서 애매한 요구 사항에 직면했을 때 가정을 표현하는 것이 좋습니다.

putchar만을 사용할 수 있다는 요구 사항은 내가 호출 할 수있는 유일한 라이브러리 함수라는 것을 의미합니다. 또한 "외부 저장소가 없다"는 것은 명시 적으로 버퍼를 만들 수 없다는 것을 의미한다고 생각합니다. 면접관은 다음 n = -n;INT_MIN 실패 할 것이라고 논평 경우 아래에 언급 한 바와 같이,

void pr_int(int n) { 
    if (n < 0) { 
     putchar('-'); 
     n = -n; 
    } 
    if (n/10 != 0) 
     pr_int(n/10); 
    putchar((n % 10) + '0'); 
} 

그때로 다시 것 : 면접관 내 가정에 동의하는 경우, 나는 계속 것

void pr_uint(unsigned int n) { 
    if (n/10 != 0) 
     pr_uint(n/10); 
    putchar((n % 10) + '0'); 
} 

void pr_int(int n) { 
    if (n < 0) { 
     putchar('-'); 
     n = -n; 
    } 
    pr_uint((unsigned int) n); 
} 
+4

'n = -n'은 INT_MIN에 대해 실패합니다. –

+0

+1 H2CO3 :하지만 n = -n; ** ** MAY ** 실패. C 표준은 실패하지 않는 구현을 허용합니다 :-) 물론 – pmg

+0

@pmg :) –

0

이미 이와 비슷한 질문이있었습니다. 대답했습니다. this.

putchar 만 사용하여 프로그램으로 변환하는 것이 쉽습니다 (예 :

while(buf[i]) 
    putc(buf[i++]); 

putc('\n'); 
+0

왜 downvote입니까? –

0

나는 무서운 무언가를 조립했습니다. 그것은 대부분 개념 증명이며, 은 실제로 무서운입니다. 양의 정수로만 작동하지만 거의 저장하지 않습니다. 아, 그리고 정수는 너무 커질 수 없으며, 버그가있을 수 있습니다.

#include <stdio.h> 
#include <assert.h> 

int main() 
{ 
    const int max_precision = 100000; 
    int b = 7414; 
    int max = b * max_precision; 

    assert(b > 0); 

    while (b <= max && b >= 0) 
    { 
     putchar('0' + (b/max_precision) % 10); 
     b *= 10; 
    } 

    putchar('\n'); 
} 

max_precision 인쇄 할 자릿수를 설정합니다. b은 실제 숫자를 저장하고 max은 루프를 종료하는 데 사용됩니다 (해당 오버플로 또는 정수 오버플로).

1

이 질문에 대한 대답은 "외부 저장소"와 "putchar"의 의미에 따라 크게 달라질 수 있습니다. C99 섹션 6.5.5 P6 바와 같이

void print_int_r (int x, int neg) { 
    int y = x/10; 
    int d = x%10; 
    if (y) print_int_r(y, neg); 
    putchar('0' + (neg ? -d : d)); 
} 

void print_int (int x) { 
    int neg = x < 0; 
    if (neg) putchar('-'); 
    print_int_r(x, neg); 
    putchar('\n'); 
} 

상기 구현은 C99 의미를 가정

정수 분할되면 / 연산자의 결과를 폐기 소수부와 대수 몫이고 . a/b의 지수를 나타낼 수있는 경우 (a/b)*b + a%ba과 같아야합니다.

그러나 %에 대한 ANSI C (C 89) 의미는 더 나쁩니다. ANSI C 3.3 절.5 P5라고 : 피연산자가 / 연산자의 결과는 대수 몫 또는 대수 지수보다 큰 가장 작은 정수보다 큰 정수 이하인지 음수

경우 부호이기 때문에 구현 정의이고 % 연산자의 결과 중 하나입니다.

Ferruccio의 두 번째 대답은 거의 완벽합니다. 문제는 변환이 올바르지 않다는 것입니다. 연산 결과가 int으로 표시 할 수없는 값인 경우 n = -n의 결과는 정의되지 않습니다. 따라서 전환은 다음과 같이 수행되어야합니다.

그리고 솔루션은 현재 모든 ISO C 표준을 준수합니다. 세부 사항은 here입니다.

관련 문제