Поиск по сайту:

Учебник по программированию на C. Часть 5. Символьные переменные


В предыдущих двух уроках мы обсудили основы переменных, в том числе то, как они занимают память. Но мы в основном сосредоточились на целых числах и числах с плавающей запятой. В этом уроке мы обсудим символы (или переменные типа char).

Переменные типа char занимают в памяти 1 байт (или 8 бит). Как я упоминал ранее в случае с int и float, вы можете проверить объем памяти, занимаемый символом в вашей системе, с помощью следующей программы на C:

#include <stdio.h>

int main (void)
{
printf("\n sizeof char in bytes is %u", sizeof(char));

return 0;
}

В моей системе было следующее:

 sizeof char in bytes is 1                                                                                               

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

#include <stdio.h>

int main (void)
{
int c;
c = getchar();
putchar(c);

return 0;
}

Приведенный выше код при выполнении сначала ожидает, пока пользователь введет символ. После этого он просто выводит тот же символ на терминал.

Вас может немного удивить, что значение, возвращаемое getchar, хранится в виде целого числа, но так оно и есть (функция возвращает целое число). Но вы всегда можете сравнить значение, возвращаемое getchar, с символом. Вот пример:

#include <stdio.h>

int main (void)
{
int c;
c = getchar();
if(c == 'a')
{
printf("matched");
}
else
{
printf ("doesn't match");
}
return 0;
}

Итак, здесь, если пользователь вводит a, программа печатает на выходе совпадающие значения. В противном случае вы увидите, что не совпадает.

О, и да, это первый раз, когда мы использовали операторы if и else. Как вы уже поняли, if позволяет выполнить набор операторов, если условие истинно. Когда условие if не выполняется, выполнение кода автоматически переходит в блок else. Обратите внимание, что вы можете использовать оператор if без оператора and else, но наоборот недопустимо.

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

#include <stdio.h>

int main (void)
{
int c =0, counter=0;
c = getchar();
while(c != EOF)
{
c = getchar();
if(c == '\n')
counter = counter+1;
}
printf("\n The input contains %d lines \n", counter+1);
return 0;
}

Чтобы понять приведенную выше программу, вы должны сначала узнать, что такое EOF. Ну, EOF означает конец файла. Используется для обозначения того, что пользователь завершил ввод данных.

Поэтому, когда вы, как пользователь, вводящий данные, завершаете процесс, вы нажимаете ctrl+d (пару раз). Именно это действие создает значение, эквивалентное значению EOF, которое можно проверить в программе — точно так же, как мы это сделали.

Возвращаясь к программе, вы сначала проверяете первый введенный символ, чтобы увидеть, является ли он EOF. Если это не так, вы входите в цикл while и постоянно проверяете каждый символ, пока не получите EOF. В течение всего этого процесса всякий раз, когда вы получаете символ новой строки (\n), вы увеличиваете переменную счетчика.

После обнаружения и EOF цикл while завершается и мы печатаем количество строк, которое на одну больше, чем значение счетчика.

Причина, по которой мы добавляем единицу в counter в функции printf, заключается в том, что количество строк всегда на единицу больше, чем количество символов новой строки (или, с точки зрения непрофессионала, количество раз, когда пользователь нажимал клавишу Enter). Конечно, это предполагает, что всякий раз, когда пользователь нажимает ввод, он также вводит некоторый текст.

Итак, если вы дадите этой программе ввод, подобный следующему:

Hello 
Welcome to HowtoForge
Thanks  

Результат будет:

The input contains 3 lines

Обратите внимание, что наш код предполагает, что пользователь предоставит хотя бы одну строку. Несколько угловых случаев не обрабатываются намеренно, чтобы все было просто. Один из них — когда пользователь вводит EOF без ввода каких-либо других символов, а другой — когда строка была предоставлена без предоставления символа новой строки.

Вычисление количества строк — это только один пример. Вы также можете расширить этот код, чтобы вычислить общее количество слов, введенных пользователем. Воспринимайте это как задание и попробуйте написать код самостоятельно. В качестве подсказки я бы сказал, что учитывайте пробелы ( ) и табуляции (\t), аналогично тому, как мы учитывали переводы строк (\n) для подсчета количества строк.

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