Как печатать специальные символы в цикле?

#c #for-loop

#c #для цикла

Вопрос:

Я пытаюсь напечатать следующий шаблон:

 @@@@@@@@
@@@@@@@
@@@@@@
@@@@@
  

Однако вместо этого я получаю это:

 @ABCDEFG
ABCDEFG
BCDEFG
CDEFG
  

Я не уверен, что я делаю неправильно. Я был бы признателен за любые отзывы или указания.

 #include <stdio.h>
#define ROWS 4
#define CHARS 8

int main(void)
{
    for(int row = 0; row < ROWS; row  )
    {
        for(char ch = ('@'   row); ch < ('@'   CHARS); ch  )
            printf("%c", ch);
        printf("n");
    }

    return 0;
}
  

Комментарии:

1. Вы пробовали отлаживать свой код?

2. Я использую текстовый редактор, и поэтому в нем нет отладчика.

3. Как ты думаешь '@' row , что это значит?

4. независимо от того, какой текстовый редактор вы использовали, для компиляции, очевидно, вам нужно использовать компилятор, который, скорее всего, будет иметь отладчик рядом

5. @DDKGM Получите бесплатную среду разработки с хорошим компилятором / отладчиком — для каждой платформы их несколько. Вы не можете научиться писать код, не изучив отладку.

Ответ №1:

Оператор работает не так, как вы думаете. @ преобразуется в его значение ASCII (64), затем вы добавляете row . Когда row есть 2 , вы говорите: выведите символ, который соответствует числу (64 2), которое есть A .

Вот таблица ASCII

Я бы изменил внутренний цикл на что-то вроде этого:

 for(int ch = row; ch < CHARS; ch  ) {
    printf("%c", '@');
}
printf("n");
  

Ответ №2:

Почему вы усложняете second for этим символом. Это может быть просто

 for(int col = row; col < CHARS; col  )
    printf("%c", '@');
  

Комментарии:

1. Или printf("@"); или даже putchar('@'); %c преобразование бессмысленно, когда печатаемый символ является константой.

2. @user3386109 Мне просто не нужно путать спрашивающего с новой функцией putchar , но это, конечно, отличная альтернатива. С другой стороны, я считаю printf("@") потенциально небезопасным. Он может передумать и изменить символ с @ на % , и он будет потерян.

3. @user3386109 Хороший компилятор сгенерирует тот же код для printf("%c", '@'); , printf("@"); , putchar('@'); . Лучше всего использовать то, что имеет смысл для контекста большего кода, и позволить компилятору обрабатывать эти небольшие оптимизации.

Ответ №3:

Измените ch на ‘@’ printf("%c", '@');