в примере:
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Я не вполне понимаю это. putchar () произвел бы символ, но почему случается так, что после EOF он производит все символы, и где он помнит все эти символы?Спасибо.
ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
-121--1096435- Это называется буферизацией , и это сделано операционной системой. Обычно он делает буферизацию линии, где она просто сохраняет каждый символ, который вы помещаете в него в память, а затем записывают все это в файл, когда он сталкивается с разрывом строки. Это экономит на ресурсах, потому что файловые операции занимают гораздо больше времени, чем другие операции. Таким образом, вместо того, чтобы делать вывод с каждым характером, он ждет куча символов, чтобы собрать в буфере и пишет их все в одном.
Это просто умный маневер, сделанный ОС, который вы, программист, не нужно беспокоиться о. Просто бросьте свои персонажи на него один за другим и позвольте ОС справиться с остальными по-своему.
[ Это не ответ, но вы не можете поместить код в комментарии ]
Я думаю вы имели в виду примерно следующее:
#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 */
}
Просто сделайте
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) не осталось ни одного символа
Давайте посмотрим на ваш код:
#include <stdio.h>
Пока все хорошо ...
main()
{
main ()
всегда возвращает
int
. Всегда. int
, но люди не помнят
этого простого при чтении кода . Продолжаем ...
long nc;
nc = 0;
Хорошая форма. Переменная инициализируется перед использованием.
while (getchar() != EOF)
++nc;
Это немного сложно. Но шаг за шагом.
getchar
возвращает
int
из стандартного ввода. EOF
. int
из стандартного ввода
не равно EOF
, переменная
nc
увеличивается. Итак, чтобы выйти из цикла while
, из стандартного ввода должен быть сгенерирован EOF.
Примечание: Ни одно из значений, считанных со стандартного ввода, не сохраняется . Каждое значение отбрасывается после оценки выражения.
Стиль : я предлагаю использовать '{' и '}' после каждого оператора while
. Это безопасная привычка.
printf("%ld\n", nc);
Вышеупомянутый оператор печатает (отображает) значение в nc
. Значение в nc
представляет количество символов, считанных из стандартного ввода. Этот оператор не отображает какие-либо символы из стандартного ввода.
}
Наконец, основная
программа должна возвращать значение операционной системе.Два переносимых значения - это EXIT_SUCCESS
и EXIT_FAILURE
, которые определены в stdlib.h
. Указание одного из этих значений также было бы хорошей привычкой.
Кстати, в опубликованном вами примере (который я скопировал в этот ответ) нет putchar
.