2016-09-23 2 views
0

Итак, я пытаюсь вывести отформатированную строку пирамиды Марио, то есть:с Е (% * 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; 
} 

Итак, как вы можете видеть, единственное отличие состоит в условные операторы, устанавливая пробелы в 0, если height == 1 или i == height - 1, но результат совершенно иной. По какой-то причине при использовании условных операторов пространство, похоже, не печатает, что на самом деле то, что я хотел, но я уверен, что это не то, как я должен это делать. Поэтому мне было интересно, знает ли кто, что именно происходит здесь, и может объяснить это мне.

ответ

2

Эта команда:

Всегда печатает хотя бы одно пространство, потому что одно пространство - это строка, которую вы печатаете.

Изменить это напечатать пустую строку:

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

Okay. Поэтому, я думаю, я должен быть более конкретным. Почему работает первая программа? Пробелы должны печатать, но они не являются Weird! –

+0

@TimBeyer Они не печатаются в первом случае, потому что вызов 'printf' находится внутри' '' '' '' '' '' '' '' '', поэтому он никогда не вызывается. – dbush

+0

Он вызывается и печатает пробелы, кроме случаев, когда height == 1 и i == height -1. –

1

В последней итерации for цикла значение spaces является 0, это эквивалентно

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

и printf печатает пространство, даже если ширина спецификатор 0, изменение:

if (spaces > 0) 
    printf("%*s", spaces, " "); 
Смежные вопросы