Консультация № 170772
25.07.2009, 00:03
0.00 руб.
0 10 1
Уважаемые эксперты, вопрос очень глупый и тем не менее... Есть программка:


это подобие элементарного текстового редактора. Может быть я туплю, но у меня не получается обратиться к функции printf и соответственно вывести на экран переменную nl. Буду крайне признателен за помощь.

Приложение:
#include <stdio.h>
/* подсчет строк входного потока */
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')
++nl;
printf("%d\n", nl);
}

Обсуждение

давно
Академик
20764
1861
25.07.2009, 00:21
общий
Вы не сообщили никаких подробностей. Я предполагаю, что программа не компилируется или не собирается.
В коде всё чисто.
Скажите, какой компилятор вы используете и приведите (точно процитируйте) его сообщения.
Неизвестный
25.07.2009, 00:43
общий
Mandriva 2008, gcc-4.2.2-3. Программа компилируется и запускается нормально. Я не понимаю, как должна выводиться переменная nl?
Неизвестный
25.07.2009, 00:45
общий
динамо:
Признак конца файла в консоли можно ввести как ^Z(Ctrl+Z). Я так понял Вы не можете закончить цикл. А в остальном все работает как и ожидается.
Неизвестный
25.07.2009, 01:01
общий
Символы вводятся. Однако, если есть printf(), стало быть должен быть какой-то вывод, а судя по учебнику, из которого я взял эту прогу, вывод быть должен (переменная nl(количество строк)).
Неизвестный
25.07.2009, 01:19
общий
Если вы прекращаете ввод комбинацией Ctrl-Z, то никакого вывода уже не будет.
Попробуйте натравить прогу на текстовый файлик: my_program_executable_file.out < input.txt
Неизвестный
25.07.2009, 01:50
общий
Не знаю как под Linux, но под Win.
Код:

aaaaaaaaaaaaaaaaaaa
cccccccccccccccc
aaaaaaaaaa
s
^Z
4

Должен же быть какой то способ задать конец файла под linux в консоли. Случайно не Ctrl+D?
Неизвестный
25.07.2009, 01:57
общий
Вот еще аналогичный пример:
#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
int с, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;
for (i = 0; i < 10, ++i)
ndigit[i]= 0;

while ((c = getchar()) != EOF)
if (c >='0' && с <= '9')
++ndigit[c – '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;

printf(“цифры =“);
for (i = 0; i < 10; ++i)
printf(“%d”, ndigit[i]);
printf(“, символы-разделители =%d, прочие =%d\n”, nwhite, nother);
}

В результате выполнения этой программы будет напечатан следующий результат:
цифры = 9 3 0 0 0 0 0 0 0 1, символы-разделители = 123, прочие = 345

Только вот, черт побери, куда он должен быть напечатан?
Неизвестный
25.07.2009, 02:03
общий
динамо:
Он будет выведен в стандартный поток вывода(stdout).
давно
Старший Модератор
17042
808
25.07.2009, 07:35
общий
это ответ
Здравствуйте, динамо!
Приведённый Вами пример является классической демонстрацией работы с потоком ввода stdout в UNIX-системах. В Вашем примере в цикле while переменной int c присваивается вывод функции int getchar(void);
getchar - это макрокоманда, вводящая символ из потока stdin. Она определена следующим образом: getc(stdin). При успешном завершении функция getchar возвращает считанный символ после предварительного преобразования его в целое без расширения знака. При возникновении ситуации EOF или при ошибке она возвращает EOF. Функция поддерживается на системах UNIX, описана Керниганом и Ритчи. Поддерживается стандартом ANSI C.
В случае, если вводимый символ оказывается символом конца строки ("\n"), т.е., если пользователь просто нажал ENTER, переменная int nl, выполняющая роль счётчика, префиксно инкрементируется (увеличивается на 1); тем самым производится подсчёт введённых строк. В случае, если введённым символом оказывается EOF, то программа завершает цикл while и выводит значение nl. Символом EOF в Linux является CTRL+D, т.е. для завершения работы программы необходимо нажать клавиши Control и D.
Вывод несколько модифицированной Вашей программы (см. приложение) показан на рисунке:


Приложение:
#include <stdio.h>
//---------------------------------------------------------
int main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
{
if (c == '\n')
{
++nl;
}
}
printf("Введено строк: %d\n", nl);
return 0;
}
5
Огромное спасибо за помощь, CTRL+D нужно было нажать два раза. В книге Кернигана и Ритчи я почему-то не нашел этого момента.<br>Теперь все корректно выводится.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
25.07.2009, 07:39
общий
Ross:
Будьте, пожалуйста, внимательнее и читайте предыдущие сообщения мини-форума. Автор вопроса за два поста до Вашего пишет "Mandriva 2008, gcc-4.2.2-3": при чём тут exe?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа