почему первая версия печатает новую строку как 129, а вторая работает нормально?

Когда я запускаю первую программу, nl (новая строка) устанавливается на 7ff и выводит 129.

#include<stdio.h>
// countblanks-tabs-newlinesv1.c
void main()
{
    long int c;
    unsigned char nl, space, tab = 0  ;

    while( ( c = getchar() ) != EOF) 
    {
        if ( c == '\n') 
        {
            nl++;
        }
        if ( c == ' ')
        {
            space++;
        }
        if ( c == '\t')
        {
            tab++;
        }
    }
    printf("input has %d newlines, %d spaces and %d tabs\n", nl, space, tab);


}   

Но когда запускаю вторую программу, все работает нормально... Думаю.

Вторая программа

#include<stdio.h>
// countblanks-tabs-newlinesv2.c
void main()
{
    long int c;
    char space, tab ;
    int nl;
    nl = 0;
    space = 0 ;
    tab = 0;

    while( ( c = getchar() ) != EOF) 
    {
        if ( c == '\n') 
        {
            nl++;
        }
        if ( c == ' ')
        {
            space++;
        }
        if ( c == '\t')
        {
            tab++;
        }
    }
    printf("input has %d newlines, %d spaces and %d tabs\n", nl, space, tab);


}   

Кстати, это упражнение 1-8 из Книги по языку программирования C

1 ответ

Вы не инициализировали nl а также space к 0в первой версии. У них непредсказуемые начальные значения, поэтому вы получите непредсказуемую сумму.

Когда ты пишешь

unsigned char nl, space, tab = 0  ;

то = 0 инициализатор применяется только к tab, не все переменные. Каждому из них необходимо указать начальное значение:

unsigned char nl = 0, space = 0, tab = 0  ;
Другие вопросы по тегам