getchar () и putchar ()

в примере:

#include <stdio.h>

main()
{
    long nc;

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

Я не вполне понимаю это. putchar () произвел бы символ, но почему случается так, что после EOF он производит все символы, и где он помнит все эти символы?Спасибо.

6
задан mob 2 February 2010 в 23:48
поделиться

4 ответа

ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
-121--1096435-

Это называется буферизацией , и это сделано операционной системой. Обычно он делает буферизацию линии, где она просто сохраняет каждый символ, который вы помещаете в него в память, а затем записывают все это в файл, когда он сталкивается с разрывом строки. Это экономит на ресурсах, потому что файловые операции занимают гораздо больше времени, чем другие операции. Таким образом, вместо того, чтобы делать вывод с каждым характером, он ждет куча символов, чтобы собрать в буфере и пишет их все в одном.

Это просто умный маневер, сделанный ОС, который вы, программист, не нужно беспокоиться о. Просто бросьте свои персонажи на него один за другим и позвольте ОС справиться с остальными по-своему.

8
ответ дан 8 December 2019 в 18:36
поделиться

[ Это не ответ, но вы не можете поместить код в комментарии ]

Я думаю вы имели в виду примерно следующее:

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    char c;
    while ((c = getchar()) != EOF)
    {
       putchar(c); /* prints one char */
        ++nc;
    }
    printf("%ld\n", nc); /* prints the number of characters read */
}
2
ответ дан 8 December 2019 в 18:36
поделиться

Просто сделайте

SELECT y.*
  FROM (SELECT name FROM cities ORDER BY population DESC LIMIT 5) AS x,
       cities AS y
 WHERE x.name = y.name
 ORDER BY y.name

Вот и все.

Ура.

-121--4780129-

Все приведенные примеры не работают в течение времени с 12:00 до 12:59. Они также выдают ошибку, если регекс не соответствует времени. Следующая обработка:

 функция parseTime (timeString) {if (timeString = ") возвращает null; var time = timeString.match (/(\d +) (: (\d\d)) ?\s * (p? )/i); if (time = = null) возвращает null; var hours = parseInt (время [1], 10); если (hours = = 12 & &! time [4]) {hours = 0;} else {hours + = (hours < 12 & & time [4])? 12:0;} var d = новая дата (); d.setHours (часы); d.setMinutes (parseInt (время [3], 10) | | 0); d.setSeconds (0, 0); возвратить d;} вар проверяет = ['13:00', '13:00', '1:00 p', '13:00', '1:00p.m'., '1:00p', '13:00', '13:00', '1 p', '13:00', '1p.m '., '1p', '13:00', '13', '1a', '12', '12a', '12p', '12:00', '12:00', '2400am', '2400pm', '2400', '1000', '100', '123', '2459', '2359', '2359am', '1100', '123p', '1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw']; для (var i = 0; i < tests.length; i++) {console.log (тесты [i] .padStart (9, ') + «=» + parseTime (тесты [i]));} 

Это будет работать для последовательностей, которые содержат время в любом месте внутри них. Итак, «abcde12: 00pmdef» будет проанализирован и вернется 12 полдень. Если желаемый результат состоит в том, что он возвращает только время, когда последовательность содержит только время в них, можно использовать следующее регулярное выражение, если заменить «time [4]» на «time [6]».

/^(\d+)(:(\d\d))?\s*((a|(p))m?)?$/i
-121--931488-

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

Убедитесь, что во входном файле (stdin) не осталось ни одного символа

1
ответ дан 8 December 2019 в 18:36
поделиться

Давайте посмотрим на ваш код:

#include <stdio.h>

Пока все хорошо ...

main()
{
  1. Функция main () всегда возвращает int . Всегда.
  2. Объявление функций без типа return - плохая форма, поскольку по умолчанию используется значение int , но люди не помнят этого простого при чтении кода .

Продолжаем ...

long nc;

nc = 0;

Хорошая форма. Переменная инициализируется перед использованием.

while (getchar() != EOF)
    ++nc;

Это немного сложно. Но шаг за шагом.

  1. Функция getchar возвращает int из стандартного ввода.
  2. Затем это значение сравнивается с EOF .
  3. Если значение int из стандартного ввода не равно EOF , переменная nc увеличивается.

Итак, чтобы выйти из цикла while , из стандартного ввода должен быть сгенерирован EOF.

Примечание: Ни одно из значений, считанных со стандартного ввода, не сохраняется . Каждое значение отбрасывается после оценки выражения.

Стиль : я предлагаю использовать '{' и '}' после каждого оператора while . Это безопасная привычка.

printf("%ld\n", nc);

Вышеупомянутый оператор печатает (отображает) значение в nc . Значение в nc представляет количество символов, считанных из стандартного ввода. Этот оператор не отображает какие-либо символы из стандартного ввода.

}

Наконец, основная программа должна возвращать значение операционной системе.Два переносимых значения - это EXIT_SUCCESS и EXIT_FAILURE , которые определены в stdlib.h . Указание одного из этих значений также было бы хорошей привычкой.

Кстати, в опубликованном вами примере (который я скопировал в этот ответ) нет putchar .

1
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: