簡體   English   中英

scanf()如何在printf()之前執行

[英]how the scanf() is executing before printf()

我有以下代碼可以像math.h庫中那樣實現pow() 好吧,我有兩個問題:

  1. 為什么scanf()語句在從printf()函數打印"power:"之前接受輸入?
  2. 我如何計算大整數的冪,例如假設所計算的冪為:22235645654789787978797797(例如)。 如何計算和打印它。

     #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); } 

圖片

在圖像中,您可以看到變量n的輸入在從printf()打印"power:"之前正在接受輸入,因此無論您鍵入什么輸入。

請幫助我理解它。 打開以獲取任何建議和意見。

您的printfscanf是按順序執行的。 由於緩沖,輸出看起來混亂了。

當打印"power:"時,它結束於緩沖區中,直到輸入數字后才會刷新該緩沖區。 添加\\n可解決控制台輸出問題。 您也可以顯式調用fflush(STDOUT)以將緩沖的字符串打印到屏幕上。

注意:您沒有正確unsigned long long讀取/打印unsigned long long 使用llu ,或參閱以下問答以獲取有關64位無符號整數的正確格式說明符:

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

您不應使用scanf("%u\\n",&n) ,而應使用scanf("%u",&n); 沒有\\n 它將完美地工作。 對於第二個問題,通常在C編程語言中看不到這類計算。 這將導致隱藏的緩沖區溢出,也許其他人會比我更好。

問題出在調用scanf()printf()函數的格式字符串中。

格式字符串不應包含“ \\ n”

所有scanf()格式字符串和printf()格式字符串都使用'%u',但它們應該使用'%llu',因此它們與變量類型匹配

注意:即使使用更正的代碼,如果結果數足夠大,也會溢出'unsigned long long int'變量,並且程序將失敗。

這是更正的代碼,請仔細檢查

#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);
}

我對您的代碼進行了一些修改,以正確格式化數字,並且我認為該程序現在可以滿足您的要求。

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM