2016-09-23 5 views
0

だから、私はすなわち、出力にマリオのピラミッドのフォーマットされた文字列をしようとしています:Cのprintf(%* s)説明

## 
    ### 
#### 

点はスペースを表しています。高さは、実行時にユーザーによって決定されます。次のコードは私が動作することがわかったものです。

#include <stdio.h> 

void hash(void) { 
    printf("%s", "#"); 
} 

int main(void) { 
    int height; 
    printf("%s", "Enter height of mario's pyramid: "; 
    scanf("%i", &height); 

    for (int i = 0; i < height; i++) { 
    int spaces; 
    if (height == 1 || i == (height - 1) { 
     spaces = 0; 
    } 
    else { 
     spaces = height - (i + 1); 
     printf("%*s", spaces, " "); 
    } 
    for (int j = 0; j < (i + 1); j++) { 
     hash(); 
    } 
    printf("\n"); 
    } 

    return 0; 
} 

ここで、何がうまくいくかを見てから、動作しないものを見てみましょう。forループ以外はすべて同じです。

#include <stdio.h> 

void hash(void) { 
printf("%s", "#"); 
} 

int main(void) { 
    int height; 
    printf("%s", "Enter height of mario's pyramid: "; 
    scanf("%i", &height); 

    for (int i = 0; i < height; i++) { 
    int spaces; 

    spaces = height - (i + 1); 
    printf("%*s", spaces, " "); 

    for (int j = 0; j < (i + 1); j++) { 
     hash(); 
    } 
    printf("\n"); 
    } 
    return 0; 
} 

あなたが見ることができるように、唯一の違いは、height == 1またはi == height - 1場合は0に空白を設定し、条件文ですが、結果は完全に異なっています。何らかの理由で、条件文を使用すると、スペースが印刷されていないように見えますが、これは実際に私が望んだものですが、これをどうやってやるべきかはわかりません。だから、私は誰かが正確に何が起こっているのか分かっていて、それを私に説明することができるのだろうかと思っていた。

答えて

2

このコマンド:

printf("%*s", spaces, " "); 

印刷する文字列が1つのスペースなので、常に少なくとも1つのスペースを印刷します。

printf("%*s", spaces, ""); 
+0

オーケー:

変更それは空の文字列を印刷します。だから私はもっと具体的にすべきだと思います。最初のプログラムはなぜ機能していますか?スペースはまだ印刷する必要がありますが、それらはありませんか?奇妙な! –

+0

@TimBeyer 'printf'への呼び出しが' if'部分ではなく 'else'部分の内側にあるので、最初のケースでは印刷されないので、決して呼び出されません。 – dbush

+0

高さ== 1、高さ== -1の場合を除いて、空白が表示されます。 –

1

forループの最後の反復においてspacesの値が0あり、これは

printf("%*s", 0, " "); 

printfに相当する幅指定子は0であっても空間を印刷に変更:

if (spaces > 0) 
    printf("%*s", spaces, " ");