Как в переменную записать слово c
Перейти к содержимому

Как в переменную записать слово c

  • автор:

Как в переменную записать слово,не используя массив?

Допустим , идет поиск наибольшего числа, и имя человека с наибольшим числом очков . Его имя должно записаться в, скажем ,тип char , string . Возможна ли такая запись без использования массива?

tcma13's user avatar

Берете одну переменную для имени, одну — для очков. Читаете первого в эти переменные.

Далее циклом читаете остальных — в еще одну переменную имени и одну очков. Если у нового очки больше — записываете в первые переменные имя и очки, если нет — игнорируете.

Как в переменную записать слово c

Функция sscanf считывает данные из строки (массива символов) в переменные. Функция имеет следующий синтаксис

Первый параметр функции представляет строку, из которой считываются данные. Второй параметр представляет формат считывания. В качестве последующих параметров указываются переменные, в которые идет считывание.

Считаем данные из строки

В данном случае строка, из которой считываются данные:

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

Эту строку передаем в функцию sscanf первым аргументом и считываем ее значения в переменные c , n , d :

А второй аргумент — формат считывания определяет, как данные из строки будут сопоставляться с переменными:

Поскольку значения в строке buff разделены пробелами, то и в строки форматирования спецификаторы разделены пробелами. Первый спецификатор %c позволяет считать первый символ в переменную типа char c .

Второй спецификатор — %d обеспечивает считывание целого числа в переменную n .

И третий спецификатор %lf считывает данные в переменную типа double — d

То есть в итоге консольный вывод был бы следующим:

Обратите внимание, что формат считывания соответствует строке, из которой считываются данные. Если бы в строке данные были бы разделены запятыми, то спецификаторы в формате считывания также были бы разделены запятыми:

Еще один пример. Пусть в строке содержатся данные пользователя, как имя, возраст, зарплата. Считаем эти данные в переменные:

Причем строка форматирования может быть более сложной. Например:

В данном случае исходная строка представляет текст «Name is Tom and age is 38» . И на эту строку накладывается строка форматирования «Name is %s and age is %d» . Соответственно здесь спецификатор %s будет представлять строку «Tom», а спецификатор %d — число 38.

Считывание с консоли

Комбинируя это функцию с fgets() , можно считывать данные с консоли:

Пример консольного ввода:

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

sprintf

Функция sprintf производит обратное действие — записывает данные в строку:

В качестве первого параметра функция принимает указатель на буфер, в который идет запись. Второй параметр представляет строку форматирования. Кроме того, в качестве дополнеительных аргументов в функцию можно передавать дополнительные значения для спецификаторов из строки форматирования. Результатом функции является длина количество записанный символов плюс нулевой символ.

В данном случае в переменную text записывается строка «Name: %s Age: %d\n» , в которую вместо спецификаторов подставляются значения переменных name и age .

Функции обработки строк в Cи

В программе строки могут определяться следующим образом:

  • как строковые константы;
  • как массивы символов;
  • через указатель на символьный тип;
  • как массивы строк.

Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .

Для корректного вывода любая строка должна заканчиваться нуль-символом '\0' , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.

Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘\»‘ .

Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .

При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

  • m2 эквивалентно &m2[0]
  • m2[0] эквивалентно ‘Г’
  • m2[1] эквивалентно ‘o’
  • m3 эквивалентно &m3[0]
  • m3[2] эквивалентно ‘x’

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

Для задания строки можно использовать указатель на символьный тип .

В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

Массивы символьных строк

Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно 'П',
*poet[l] эквивалентно '-'.

Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Массив строк

Свободный массив

Операции со строками

Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

  • выделить блок оперативной памяти под массив;
  • проинициализировать строку.

Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:

Для ввода строки использована функция scanf() , причем введенная строка не может превышать 9 символов. Последний символ будет содержать '\0' .

Функции ввода строк

Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат "%s" для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

Для ввода строки, включая пробелы, используется функция

В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.

Функции вывода строк

Для вывода строк можно воспользоваться рассмотренной ранее функцией

или в сокращенном формате

Для вывода строк также может использоваться функция

которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

Функция ввода символов

Для ввода символов может использоваться функция

которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.

Функция вывода символов

Для вывода символов может использоваться функция

которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

Пример Посчитать количество введенных символов во введенной строке.

Результат выполнения
Количество введенных символов в строке

Символы

Тип данных, используемый для записи символов называется char. Для считывания ввода/вывода символа используется спецификатор %c в командах scanf/printf. Пример ввода символа:

Под одну переменную типа char отводится в памяти место в 8 бит, это значит, что значение переменной может быть в пределах от -128 до 127. В переменной по факту хранится номер символа в таблице символов ASCII (таблицу можно посмотреть в интернете).
Часть таблицы ASCII:

Чтобы использовать номер символа, нужно написать этот символ в одинарных кавычках, например: ’$’. Это обозначение интерпретируется программой как номер символа $, то есть ‘$’ = 36.

Задача: вводится символ, если это заглавная английская буква C, то вывести yes, иначе no.

Решение: У нас есть два варианта как сравнить символы. Первый — это воспользоваться таблицей ASCII, в ней номер символа C равен 67. Второй — это воспользоваться одинарными ковычками: ‘C’. Естественно второй способ кажется нам проще(нам не нужно узнавать номер требуемого символа), но бывают задачи, в которых нужно воспользоваться данной таблицей. Такая задача есть чуть ниже.

Второй способ:

Важно!

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

Задача: вводится заглавная буква английского языка, нужно вывести ее же, но только строчную.

Решение: Давайте посмотрим на таблицу символов, мы видим, что заглавные и строчные буквы идут по порядку от ’A’(номер 65) до ’Z’(номер 90) и прописные тоже от ’a’(номер 97) до ’z’(номер 122). Поэтому, чтобы перейти от любой заглавной буквы к соответствующей ей строчной букве нужно прибавить к её номеру 32. Код на Си:

Строки

В языке Си нет отдельного типа строк. Поэтому для записи строк используют массив типа char, то есть каждый элемент массива это какой-нибудь символ. Количество элементов массива будет являться максимальным размером строки. Важно помнить, что даже пробел это отдельный символ и он будет записан в массив.

Давайте попробуем ввести строку. Можно воспользоваться привычной уже нам функцией ввода scanf() вместе со спецификатором %s:

Но, используя scanf(), ввод строки будет осуществляться только до пустого символа, которым может быть и пробел. Поэтому, чтобы ввести полностью строку(до символа перевода строки), используется функция gets():

Последним элементом строки являться нуль символ, он обозначается так: ‘\0’. Этот символ нужен, чтобы понимать, где закончилась строка, а также, чтобы правильно работали функции для работы со строками.

Вот так выглядит строка «string», записанная в массив array:

Функции putchar() и getchar()

Эти функции служат для ввода и вывода только одного символа.

getchar()

Функция getchar() служит для ввода одного символа и возвращает его. Пример ввода символа с помощью getchar():

Если достигнут конец файла, то getchar() возвращается EOF. Этот факт можно использовать для ввода строки. Например, вам нужно вывести только цифры из заданной строки. Часть кода на Си:

Важно!

Часто в задачах нам нужно ввести что-то через функцию ввода scanf(), а после нее вести строку. Но scanf() не считывает символ перевод строки ‘\n’, поэтому gets(), следуя за scanf(), считает пустую строку. Для решения этой проблемы нам как раз может пригодиться getchar(). Он и считает этот одиночный символ перевода строки ‘\n’. Задача: водится размер строки и сама строка, нужно вывести строку. Код на Си:

putchar()

Если нам нужно вывести символ, то мы можем использовать не printf(), а putchar(). Пример ввода с помощью getchar() и вывода с помощью putchar():

Основные функции для строк

Существуют разные функции для строк, полностью про все функции рассказано в разделе Основные библиотеки в Си. Ниже приведены часто используемые функции:
1) Длина строки. В переменную length будет записана длина строки S.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *