Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > getchar() и несложный алгоритм


Автор: APXEOLOG 8.1.2009, 22:58
Начал учить си по учебнику Б. Кернигана и Д. Ритчи.
В разделе про ввод\вывод там приведен такой код:
Код

/*Следующая программа подсчитывает строки. Как упоминалось выше, стандартная библиотека обеспечивает такую
модель ввода-вывода, при которой входной текстовый поток состоит из последовательности строк, каждая из которых
 заканчивается символом новой строки. Следовательно, подсчет строк сводится к подсчету числа символов новой строки.

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


И вот теперь вопрос: getchar() возвращает код символа. Как можно код символа сравнивать с '\n' ??

Еще вопрос: когда я запускаю программу то она так и не выдает результата, а все принимает и принимает  строки. Почему? я думал что While относиться только к разовому прохождению getchar по введенной строке...

Автор: pan2004 9.1.2009, 00:11
Цитата(APXEOLOG @  8.1.2009,  22:58 Найти цитируемый пост)
 Как можно код символа сравнивать с '\n'

А что такое '\n', знаешь? Это символ новой строки. Впринципе, об этом недвусмысленно в комментариях и сказано.

Цитата(APXEOLOG @  8.1.2009,  22:58 Найти цитируемый пост)
Почему?

Наверное, ждет символа конца файла(EOF). Как он вводится с клавиатуры - не помню, Ctrl + чтототам smile 

Автор: APXEOLOG 9.1.2009, 13:03
А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?

И как сделать чтобы getchar() обрабатывал только 1 введенную строку (вписал строку нажал ентер и все)

С помощью чего можно узнать он нажатии кнопки (например стрелочек)?

Автор: yngwie19 9.1.2009, 13:54
pan2004, Ctrl^z

Автор: Avaj 9.1.2009, 14:02
Цитата

А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?


Нет, всё что в  кавычках - строки, в данном случае, "\n" - строка из одного символа - '\n'.(ну возможно в конце ещё есть '\0')


Цитата

И как сделать чтобы getchar() обрабатывал только 1 введенную строку (вписал строку нажал ентер и все)


По-моему getchar() аргументом принимает символ (с клавиатуры), а не строку. Если тебе нужно строку, лучше gets().


Цитата

С помощью чего можно узнать он нажатии кнопки (например стрелочек)?


Я так подозреваю с помощью getchar(), но точно не знаю, тут в google можно обратиться, или подождать когда ответят знающие люди.

И ещё по языку Си есть учебник Подбельского, там по-моему по-подробней написано, хотя конечно "K&R" - "must read" smile .

Автор: seravr 9.1.2009, 15:21
Объясняю все по пунктам:

1) писать надо либо

void main()
{    
    .
    .
    .
}

но лучше на первых порах пиши 
int main()
{
    .
    .
    .
    return 0;
}
со временем сам поймешь 

2) getchar()-(прототип int getchar(void))-считывает очередной символ из стандартного входного потока
3) у тебя в программе инициализируются 2 переменные типа int: c-в нее записывается очередной считанный символ из входного потока, nl-счетчик числа строк, т.е. сколько раз встречается '\n'-символ новой строки
4)в цикле while условием является строчка (с = getchar()) != EOF
советую тебе выучить наизусть приоритет операций языка С!!!

Давай разберем это условие, во-первых, истинно оно будет всегда, пока очередной символ,считанный из входного потока,не равен EOF(для Windows это комбинация клавишь Ctrl^z, как сказал это уже yngwie19)

(с = getchar()) != EOF

Покажем как это работает:

сначала работает с = getchar(), функция  читает символ из входного потока и возвращает его значение типа int, затем его мы присваиваем переменной с, затем мы проверяем !=(не равно) EOF, если не равно-значит истина и мы попадаем в тело цикла
Там стоит
if (c == '\n')
если  с не равно '\n', переходим к проверке условия в цикле.
а если с равно '\n', то увеличиваем счетчик ++nl, затем переходим опять к проверке условия, и так пока ты не введешь комбинация клавишь Ctrl^z

Когда наконец-то ты введешь комбинация клавишь Ctrl^z,условие в цикле с = getchar()) != EOF станет ложным, и мы покидаем цикл и переходим к следующей строчке printf(“%d\n”, nl);, где мы выводим значение счетчика, затем должна стоять строчка return 0, которая передает управление в твоем случае Windows

Мой совет тебе, почитай Подбельского, выучи таблицу приоритетов операций, уясни как работают циклы, что для них является ложью и истинной, и на последок, старайся всегда инициализировать все переменные в их объявлении, потому что в них храниться мусор и это может приводить к логическим ошибкам и т.д.

P>S> НА СИНТАКСИЧЕСКИЕ ОШИбКИ НЕ ОбРАЩАЙТЕ ВНИМАНИЯ 

Автор: APXEOLOG 9.1.2009, 16:13
Спасибо, сажусь за теорию углубленно.

=====

Может ли функция возвращать массив значений? (Без использования указателей и изменения глобальных переменных)

Автор: pan2004 9.1.2009, 17:12
Цитата(APXEOLOG @  9.1.2009,  16:13 Найти цитируемый пост)
Может ли функция возвращать массив значений? (Без использования указателей и изменения глобальных переменных)

1. Используй ссылки(хотя все равно почти что указатели)
2. можно возвращать переменные любых типов, в тч классы и структуры. Туда можно что угодно запихнуть
Цитата(APXEOLOG @  9.1.2009,  13:03 Найти цитируемый пост)
А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?

"\n" - строка из двух символов, '\n' и '\0'
эскейп последовательности типа \n \t usw компилятором всегда преобразуются в соответствующие символы.

Автор: seravr 9.1.2009, 17:46
не забивайте человеку голову ссылками, пусть изучит сначала поглубже язык С

Стек то не резиновый

Автор: vinter 9.1.2009, 18:09
Цитата(seravr @  9.1.2009,  18:46 Найти цитируемый пост)
не забивайте человеку голову ссылками, пусть изучит сначала поглубже язык С

зачем? может еще какой язык посоветуешь перед С++?

Автор: seravr 9.1.2009, 23:07
что зачем?
если он указатели то не понимает, зачем ему про ссылки рассказывать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)