почему первая версия печатает новую строку как 129, а вторая работает просто отлично? - PullRequest
0 голосов
/ 23 января 2020

, когда я запускаю первую программу, 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 Ответ

3 голосов
/ 23 января 2020

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

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

unsigned char nl, space, tab = 0  ;

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

unsigned char nl = 0, space = 0, tab = 0  ;
...