Простая программа, добавляющая "D" к выводу - PullRequest
2 голосов
/ 20 сентября 2009

У меня есть очень простая программа, которая просто печатает число строк в виде целого числа, и после каждого числа я получаю "D".

Пример ввода:
d [введите]
е [введите]
f [enter]
Ctrl-D [ввод]

Пример вывода:
3D

Что я делаю не так?

Это дословно из The C Programming Language 2nd edition, pg. 19:

#include <stdio.h>

main()  
{  
    int c, nl;  
    nl = 0;

    while ((c = getchar()) != EOF)  
        if (c == '\n')  
            ++nl;  
    printf("%d\n", nl);  
}

Ответы [ 3 ]

4 голосов
/ 20 сентября 2009

Я думаю, что D исходит из Ctrl D. Консоль выводит ^ D в качестве стандартной логики эха, прежде чем передать соответствующий символ (или, скорее, здесь отсутствие символа, то есть статус EOF) в getchar (), однако, и по праву, не отправляя cr / lf. Программа C затем отправляет 3, et voila ...

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

2 голосов
/ 20 сентября 2009

Измените строку печати на это:

printf ("\ n% d \ n", nl);

Тогда вы увидите, что когда вы нажмете Ctrl-D, вы получите «^ D» в строке. Только если вы не нажали ctrl-D, а затем Enter, это означает, что он не находится на новой строке в исходной программе. Не все системы будут возвращать вам ctrl-d, но это, например, в OS-X. Таким образом, в итоге получается испортить вывод, если вы напечатаете однозначное число. Вам придется обойти это.

0 голосов
/ 20 сентября 2009

Это прекрасно работает для меня с GCC, независимо от того, пишу ли я по каналу ввода или вручную набираю его и заканчиваю ^ D.

$ ./a.out
1
2
3
3
$ echo -ne "1\n2\n3\n" | ./a.out
3

Это, вероятно, как @mjv сказал, и консоль эхом возвращает D - вы на Windows, верно? Я думаю, что это нормально для консоли Windows .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...