2014-12-26 3 views
1

Использование вложенных циклов для получения следующихC Primer Plus Глава 6 Упражнение 4

A 
BC 
DEF 
GHIJ 
KLMNO 
PQRSTU 

Вот то, что я до сих пор. Я получаю неприятную ошибку времени выполнения.

#include <stdio.h> 

int main(void) { 

    int row; 
    char let; 
    char ch = 'A'; 

    for (row = 1; row <= 6; row++) { 

     for (let = ch; let < (let + row); let++) { 

      printf("%c", let); 

     } 

     ch = let; 
     printf("\n"); 

    } 

    return 0; 
} 

Я не уверен, что делать в этот момент. Является ли ошибка результатом письмо, не обновляющееся?

+0

, что это ошибка? – segarci

+0

@segarci, OP упомянул, что он получил ошибку Runtime –

+1

@CoolGuy - Ошибки во время выполнения имеют много вариантов –

ответ

2

Ваш цикл никогда не прерывается, так как условие let < (let + row); всегда верно! например подсказка: как может 1 < (1 + i) ??

+0

Это зависит от того, предоставляет ли его компилятор подписанный или неподписанный тип 'char'. В стандарте C не указывается. –

1

Является ли этот бит

let < (let + row) 

собирается всегда быть правдой?

+0

Это зависит от того, предоставляет ли его компилятор подписанный или неподписанный тип 'char'. В стандарте C не указывается. –

2

Изменить

for (let = ch; let < (let + row); let++) 

в

for (let = ch; let < (ch + row); let++) 

или иначе, вы получите бесконечный цикл, как let < (let + row) никогда не будет ложным. Это может различаться между компиляторами. В стандарте C не указывается, let является unsigned char или signed char. Так что до компилятора это решить.

Если let был unsigned char, то цикл цикл будет и в конечном счете, (let+row) будет обтекать (из-за переполнения) к значению 0, а затем, цикл завершается.
Если let был signed char, значит, в конце концов, (let+row) переполнит и сможет хранить любое значение. Это приводит к неопределенному поведению, и нельзя гарантировать, что цикл закончится или нет.

+0

Это зависит от того, предоставляет ли его компилятор подписанный или неподписанный тип 'char'. В стандарте C не указывается. –

+0

@BenVoigt. Поэтому, если 'let' был' unsigned char', тогда цикл скоро закончится, и если 'let' будет' signed', то это будет UB? –

+0

Да, точно верно. –

0

изменение

for (let = 0; let < row; let++) { 
    printf("%c", ch + let); 
} 
ch += let; 
+1

Вы должны подробно остановиться на проблеме ОП. – manuell

Смежные вопросы