2016-06-25 4 views
0

다음 코드는 math.h 라이브러리와 마찬가지로 pow()을 구현하는 코드입니다. 잘 나는 두 가지 질문이 있습니다printf() 전에 scanf()를 실행하는 방법

  1. 이유는 scanf() 문가의 printf() 함수에서 "power:"를 인쇄 전에 입력을 취하고있다?
  2. 계산 된 전력이 22235645654789787978797797 (예 :)과 같이 큰 정수의 거듭 제곱을 계산하는 방법은 무엇입니까? 어떻게 계산하고 인쇄합니까? 이미지는 변수 n의 입력을 볼 수 있습니다에서 Image

#include <stdio.h> 
unsigned long long int pow(unsigned long long int n,unsigned long long int d); 
int main(){ 

unsigned long long int a,x,n; 
printf("Number:"); 
scanf("%u\n",&a); 
printf("power:"); 
scanf("%u\n",&n); 
x = pow(n,a); 
printf("%u\n",x); 
} 
unsigned long long int pow(unsigned long long int n,unsigned long long int d){ 
if(n+1==1) 
    return 1; 
return d*pow(n-1,d); 
} 


그래서 상관없이 사용자가 입력 할 것을 입력의 printf()에서 "power:"를 인쇄하기 전에 입력을 복용하지 않습니다.

제발 이해해주세요. 제안 및 의견을 기다립니다.

+0

첫 번째 질문 대답 된 검사 두 번째 당신이 찾아야한다 (또는 쓰기). –

+0

[\ [this \]] (http://stackoverflow.com/a/21860015/1620779) 답변을 참조하십시오. – sjsam

+1

[\ [this \]] (http://stackoverflow.com/questions/21859277/behaviour-of-scanf-when-newline-is-in-the-format-string) 질문의 가능한 복제본. – sjsam

답변

3

printfscanf은 순서대로 실행됩니다. 버퍼링으로 인해 출력이 엉망으로 보입니다.

"power:"이 인쇄되면 숫자가 입력 될 때까지 플러시되지 않는 버퍼에서 끝납니다. \n을 추가하면 콘솔 출력용으로이를 해결합니다. fflush(STDOUT)을 명시 적으로 호출하여 버퍼링 된 문자열을 화면에 인쇄 할 수도 있습니다.

참고 :unsigned long long을 올바르게 읽거나 인쇄하지 않습니다. llu 사용, 또는 64 비트 부호없는 정수에 대한 적절한 형식 지정자에 대한 this Q&A를 참조하십시오 당신은 scanf("%u\n",&n)를 사용 \n없이 scanf("%u",&n);를 사용해서는 안

unit64_t a, x; 
... 
scanf("%"SCNu64, &a); 
printf("n: %"PRIu64"\n", x); 
1

. 그것은 완벽하게 작동합니다. 두 번째 질문의 경우, 이러한 종류의 계산은 일반적으로 C 프로그래밍 언어에서 볼 수 없습니다. 그것은 숨겨진 버퍼 오버 플로우로 이어질 것입니다, 아마도 다른 누군가가 나보다 잘 대답 할 것입니다.

+0

'unsigned long long'으로, 그것은 완벽하지 않을 것입니다. –

+1

맞습니다. % llu를 사용해야합니다. 문제는 \ n이 문제를 일으키는 것입니다. –

0

번호를 올바르게 형식을 지정하기 위해 코드를 약간 수정했으며 프로그램이 현재 원하는대로 처리한다고 생각합니다.

#include <stdio.h> 
unsigned long long int pow(unsigned long long int n,unsigned long long int d); 
int main(){ 

    unsigned long long int a,x,n; 
    printf("Number:"); 
    scanf("%llu",&a); 
    printf("power:"); 
    scanf("%llu",&n); 
    x = pow(n,a); 
    printf("%llu\n",x); 
} 
unsigned long long int pow(unsigned long long int n,unsigned long long int d){ 
    if(n+1==1) 
     return 1; 
    return d*pow(n-1,d); 
} 

테스트

Number:2 
power:10 
1024 
+0

예를 들어 잘 작동하지만 Number : 256과 power : 25와 같은 값을 취한다고 가정 해 봅시다. 결과가 0입니다. 어떻게 이해하지 못했습니까? – bhansa

+1

256은 0과 동일한 8 개의 최하위 비트를가집니다. 256 제곱에는 16 개가 있고, 256 큐브에는 24가 있습니다. 그래서 256의 힘 25는 전체 변수를 많이 차지할 것이고, 그 나머지 숫자는 잘립니다. –

+0

좋았지 만 제목에 언급 된 질문에 답할 수 없습니다. – sjsam

1

문제는 scanf()printf() 기능에 대한 호출에 대한 형식 문자열입니다. '유 %'를 사용하고 있지만,이 '%의 LLU'를 사용해야 그들이 변수 유형과 일치 있도록

형식 문자열은 '\ n을'

모든 scanf() 형식 문자열과 printf() 형식 문자열을 포함 할 수 없습니다

참고 : 수정 된 코드의 경우에도 결과 값이 충분히 크면 '부호없는 long long int'변수가 오버플로되어 프로그램이 실패합니다.여기

가 수정 된 코드하는 BIGINT 라이브러리를 조심스럽게

#include <stdio.h> 
#include <stdlib.h> 

unsigned long long int myPow(unsigned long long int n, unsigned long long int d); 

int main(void) 
{ 
    unsigned long long int a,x,n; 

    printf("Number:"); 
    if(1 != scanf("%llu",&a)) 
    { 
     perror("scanf for first number failed"); 
     exit(EXIT_FAILURE); 
    } 

    printf("power:"); 
    if(1 != scanf("%llu",&n)) 
    { 
     perror("scanf for second number failed"); 
     exit(EXIT_FAILURE); 
    } 

    printf("n=%llu, a=%llu\n", n, a); 
    x = myPow(n,a); 
    printf("%llu\n",x); 
} 

unsigned long long int myPow(unsigned long long int n,unsigned long long int d) 
{ 
    if(n+1==1) 
     return 1; 
    return d*myPow(n-1,d); 
} 
+0

대단히 고마워요. – bhansa

관련 문제