Ошеломлен упражнением K & R 1.5.2 - PullRequest
1 голос
/ 18 сентября 2011

В настоящее время я пытаюсь изучить C, используя K & R, но я полностью озадачен примером 1.5.2.Почему-то после того, как я нажимаю Ctrl-Z, вместо того, чтобы печатать nc, он печатает nc, умноженное на 2. Я не знаю, что может быть причиной этой проблемы (я скопировал код точно так, как он есть в книге).Я использую компилятор Visual Studio 2010. Вот код:

#include <stdio.h>

main()
{

long nc;

nc = 0;
while (getchar() != EOF)
    ++nc;
printf("%1d\n", nc);


}

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Потому что enter - это нажатие клавиши.

Если вы введете:

1<enter>
1<enter>
1<enter>
^z

будет выведено:

6

1 голос
/ 18 сентября 2011

Не знаю, почему вы получаете описанное вами поведение, но это должно быть% ld, а не% 1d

0 голосов
/ 18 сентября 2011

Не удалось воспроизвести вашу ошибку. Я добавил несколько отладочных операторов,

#include <stdio.h>

main() {
     int nc = 0, ch;

     while ((ch = getchar()) != EOF) {
          printf("%d\n", ch);
          ++nc;
     }
     printf("nc - %1d\n", nc);


}

А потом попробовал с gcc в Windows:

E:\temp>gcc eof.c

E:\temp>a
^Z
nc - 0

E:\temp>a
foo bar
102
111
111
32
98
97
114
10
^Z
nc - 8

А затем с Visual Studio 2008:

E:\temp>cl eof.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

eof.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:eof.exe
eof.obj

E:\temp>eof
^Z
nc - 0

E:\temp>eof
foo bar
102
111
111
32
98
97
114
10
^Z
nc - 8
...