Подсчет символов в C на Mac OS X - PullRequest
3 голосов
/ 12 января 2011

Прямо из K & R, у меня есть

#include <stdio.h>

main() {
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

Я нахожусь на Mac OS X, поэтому я скомпилирую его, запустите, введите «12345», нажмите ввод для новой строки (я думаю, это шестой символ), а затем нажмите Ctrl-D для отправки EOF. 1004 *

Эта вещь печатает "6D". Почему там D? Как мне написать программу, чтобы просто посчитать 5 символов в «12345», а не перевод строки? Должен ли я просто вычесть один в конце? Как мне заставить его прекратить печатать D?

Ответы [ 2 ]

9 голосов
/ 12 января 2011

Что происходит, так это то, что терминал на самом деле повторяет ваш control-D (и печатает его как ^D) при его вводе, но затем ваша программа перезаписывает эту строку числом и строкой кормить. Таким образом, ваше однозначное число перезаписывает ^, но D остается там.

Если вы введете более 10 символов или измените код, добавив пробел в конце строки формата ("%ld \n"), тогда ваша программа перезапишет ^D (хотя она все равно будет отображаться вашим терминалом)

1 голос
/ 12 января 2011

Программа работает правильно: печатает 6.

Вы видите 6D, потому что окно терминала, напечатанное ^ D, затем вернулось к началу строки, и ваша программа печатает 6 поверх ^, оставляя следующий D. Попробуйте перенаправить вывод в файл или дать ему достаточно ввода, чтобы ответ содержит более одной цифры, и вы не увидите D.

Ответ 6 вместо 5 из-за новой строки, да. Если вы не хотите считать новую строку в конце, вычтите 1. Если вы не хотите считать какие-либо новые строки, вычитайте 1 всякий раз, когда вы видите новую строку.

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