Перейти к содержимому

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

  • автор:

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

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

tcma13's user avatar

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

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

Тип string . Примеры. Функции, свойства, операции

В языке C# встроенный тип данных string поддерживает символьные строки в кодировке Unicode. Для строк типа string можно выделить следующие особенности:

  • любая переменная типа string представляет собой объект класса System.String ;
  • тип string относится к ссылочным типам а не типам-значениям;
  • строки типа string размещаются в «куче» (heap);
  • к строкам типа string можно применять разнообразные методы, свойства и операции;
  • строку типа string можно создавать с использованием оператора new и без использования этого оператора путем присваивания = ;
  • содержимое объекта типа string изменить нельзя.

Пример строки-литерала типа string :

2. Способы создания экземпляра типа string

Как известно тип string есть псевдонимом класса System.String , который имеет несколько конструкторов. С помощью этих конструкторов можно создавать экземпляры класса string . Ниже приводится пример программы, в которой продемонстрировано создание экземпляров типа string разными способами.

Результат выполнения программы

3. Как в переменную типа string занести значение строки? Операция присваивания =

Для этого нужно использовать оператор присваивания ‘ = ‘.

Вариант 1. Присваивание после описания.

Вариант 2. Присваивание во время описания (начальная инициализация).

Вариант 3. Использование метода Copy() .

4. Как определить, равны ли две строки типа s tring между собой? Операция сравнения ==

Две строки можно сравнивать обычным оператором сравнения « == «.

Фрагмент кода, который определяет равенство (неравенство) двух строк:

5. Как сравнить две строки типа string в лексикографическом порядке? Метод CompareTo()

В этом случае можно использовать метод CompareTo() . Метод возвращает -1 , 0 или 1 .

В приведенном примере видно результат работы метода.

6. Как соединить две строки типа string ? Метод Concat() , операция +

Способ №1 — функция Concat() .

Способ № 2 — использование оператора «+».

7. Как скопировать одну строку типа s tring в другую? Метод Copy() , оператор присваивания =

Способ № 1 — оператор присваивания.

Способ №2 — метод Copy() .

8. Вставка подстроки начиная из заданного индекса. Метод Insert()

Для вставки подстроки используется функция Insert() . Функция принимает два параметра. Первый параметр – позиция индекса в строке, из которой делается вставка (начинается с 0 ). Второй параметр – текст самой строки.

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

9. Поиск и получение индекса первого вхождения подстроки в данную строку. Метод IndexOf()

Эта операция реализуется функцией IndexOf() . Если найдена подстрока в строке, то функция возвращает позицию первого вхождения. В другом случае функция возвращает -1 .

Функция имеет перегруженные варианты реализации.

10. Поиск и получение индекса последнего вхождения подстроки в данную строку функцией LastIndexOf() .

Функция имеет несколько перегруженных реализаций. Нумерация индекса последнего вхождения начинается с 0 .

11. Как определить длину строки типа string ? Свойство Length

Для определения длины строки (количество символов) типа string используется свойство Length.

12. Создание строки заданной ширины. Функции PadLeft() и PadRight()

Функции PadLeft() и PadRight() используются для создания форматированной строки, в которой позиции справа или слева заполняются пробелами.

13. Удаление заданного количества символов из строки. Функция Remove()

Функция Remove() имеет две реализации. В первой реализации функция имеет два параметра. Во второй – один параметр.

Пример 1. Реализация функции Remove() с двумя параметрами.

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

Пример 2. Реализация с одним параметром.

В этом примере функция получает один параметр. Этот параметр определяет позицию из которой будет осуществлено удаление символов до конца строки.

то будет удалена вся строка.

Пример 3. Если нужно удалить последний символ в строке, то нужно написать такой код.

14. Замена символов в строке. Функция Replace()

Функция Replace() имеет два варианта реализации.

Первый вариант оперирует строками типа string . Второй вариант оперирует типом char .

Пример 1. Использование функции Replace() для замены одной строки на другую.

Пример 2. Использование функции Replace() для замены символа ‘0’ на символ ‘A’ .

15. Как в строке выделить подстроку. Функция Substring()

Функция Substring() имеет две реализации.

Вариант 1. Выделение подстроки с заданной позиции до конца строки.

16. Преобразование числовой строки типа string в целое число. Функция Parse()

Функция Parse() разрешает переводить строку, которая состоит из цифр, в целое число. Такая функция полезна если нужно получить число, которое было введено из клавиатуры и получено в виде строки. Например, ввод из элемента управления типа TextBox .

17. Преобразование целого числа в строку. Функция ToString()

Функция ToString() переводит целое число в его строчное представление. Например, такая функция полезная, если нужно вывести целое число на форму в элементе управления Label .

18. Преобразование строки string в число с плавающей запятой (вещественное число)

При преобразовании строки в соответствующее вещественное число, важно учитывать кодировку символов.

Если у вас установлена операционная система с кирилличной кодировкой и настроены соответствующие региональные стандарты, тогда символ ‘.’ может быть заменен на символ ‘,’ . Это связано с тем, что в странах, которые используют кириллицу как разделитель между целой и дробной частями, есть символ ‘ ,’ (запятая). А в англоязычных странах разделителем целой и дробовой частей есть символ ‘.’ (точка).

Символ-разделитель целой и дробной частей можно изменить в региональных настройках Windows.

Поэтому, в ОС Windows с кириллическим кодированием по умолчанию, следующий код вызовет исключительную ситуацию FormatException с сообщением: « Input string was not in a correct format » (Исходная строка имеет неверный формат).

Ниже приведен правильный вариант для ОС с кирилличной кодировкой:

19. Преобразование числа с плавающей запятой в string .

20. Перевод значения переменной логического типа bool в строку string

Если ввести неправильное значение в строку s , то генерируется исключительная ситуация с сообщением:

21. Постоянство строк. Как в строке типа string заменить символ в заданной позиции: s[index] = c

В языке C# тип string имеет одну особенность. Доступ к отдельному символу строки осуществляется в режиме чтения. Непосредственно изменить значение символа в строке не получится. Это означает, что строки есть постоянными (константными).

Нижеследующий фрагмент кода

вызовет ошибку компилятора

Значит, значение символа в заданной позиции строки типа string можно только прочитать.

Чтобы решить эту задачу можно использовать (как пример) один из предложенных способов.

Способ 1. Использование методов Substring() и String() . При использовании этого способа нужно выполнять проверку значения индекса на корректность. Если значение индекса выходит за пределы размерности строки, то возникнет исключительная ситуация.

Способ 2. Использование оператора цикла.

Способ 3. Использование методов Remove() и Insert() . В этом случае также нужно проверять индекс замены на корректность.

Особенности работы со строками

Неформатированные ввод из стандартного потока и вывод в стандартный поток

С помощью функции printf() можно легко вывести на экран строку, содержащую пробелы:

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

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

В заголовке цикла getchar() возвращает символ, далее записываемый в очередную ячейку массива. После этого элемент массива сравнивается с символом ‘\n’. Если они равны, то цикл завершается. После цикла символ ‘\n’ в массиве «затирается» символом ‘\0’. В условии цикла должна быть также предусмотрена проверка на выход за пределы массива; чтобы не усложнять пример, опущена.

Однако в языке программирования C работать со строками можно проще. С помощью функций стандартной библиотеки gets() и puts() получают строку из стандартного потока и выводят в стандартный поток. Буква s в конце слов gets и puts является сокращением от слова string (строка).

В качестве параметров обе функции принимают указатель на массив символов (либо имя массива, либо указатель).

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

Итак, если вы работаете со строками, а не другими типами данных, при этом нет необходимости выполнять их посимвольную обработку, то удобнее пользоваться функциями puts() и gets() . (Однако функция gets() считается опасной и была выпилена из версии языка C11.)

Массив символов и указатель на строку

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

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

Иногда в программах можно видеть такое объявление и определение переменной-указателя:

Строку, которая была присвоена не массиву, а указателю, также можно получить, обратившись по указателю:

Но давайте посмотрим, что же все-таки происходит, и чем такая строка, присвоенная указателю, отличается от строки, присвоенной массиву.

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

Что происходит в примере? В программе вводится строковый объект, который по сути является строковой константой (литералом). Ссылка на первый элемент этой строки присваивается указателю. Мы можем менять значение указателя сколько угодно, переходить к любому из элементов константного массива символов или даже начать ссылаться на совершенно другую строку. Но вот поменять значение элементов строки не можем. Это можно доказать таким кодом:

В последней строке кода возникнет ошибка, т.к. совершается попытка изменить строку-константу.

Тем более нельзя делать так:

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

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

Передача строки в функцию

Передача строки в функцию ничем не отличается от передачи туда массива чисел:

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

Объявите в программе три массива символов. Данные для двух из них получите с помощью вызовов функции gets() . Третий массив должен содержать результат конкатенации (соединения) двух введенных строк. Напишите функцию, которая выполняет конкатенацию строк.

Массив строк и массив указателей

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

Набор строк можно представить как двумерный массив, т.е. массив, состоящий из одномерных массивов, где каждый одномерный массив — это строка символов:

Представьте себе, что значит выполнить сортировку строк. Это значит, надо поменять местами содержимое множества ячеек памяти. Это достаточно трудоемкая для компьютера работа, особенно если строк очень много. Однако можно поступить по-иному. Достаточно создать массив указателей, каждый элемент которого будет указывать на соответствующую ему строку первого массива. Далее выполнить сортировку указателей, что несомненно быстрее. Конечно, сам массив строк отсортирован не будет, однако благодаря указателям у нас будет хранится отсортированный «срез» массива:

Примечания к программе:

  • На самом деле параметром функции sortlen() является указатель на указатель. Хотя для понимания проще сказать, что параметром является массив указателей на символы. Мы передаем в функцию указатель на первый элемент массива strP, который сам является указателем. Если бы в функции мы инкрементировали переменную s, то переходили бы к следующему элементу-указателю массива strP.
  • Сортировка выполняется методом пузырька: если длина строки, на которую ссылается следующий указатель массива strP, меньше длины строки под текущим указателем, то значения указателей меняются.
  • Выражение strP[i] = &strings[i][0] означает, что элементу массива указателей присваивается ссылка на первый символ каждой строки.

Напишите программу, которая сортирует строки по алфавиту. Для упрощения задачи пусть сортировка выполняется только по первым буквам строк (если первые буквы слов одинаковы, то вторые и последующие символы проверять не надо).

Строки в языке C

Строка — это последовательность ASCII или UNICODE символов.

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

Исторически сложилось два представления формата строк:

  1. формат ANSI;
  2. cтроки с завершающим нулем (используется в C).

Формат ANSI устанавливает, что значением первой позиции в строке является ее длина, а затем следуют сами символы строки. Например, представление строки «Моя строка!» будет следующим:

11 ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’
В строках с завершающим нулем, значащие символы строки указываются с первой позиции, а признаком завершения строки является значение ноль. Представление рассмотренной ранее строки в этом формате имеет вид:

‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ 0

Объявление строк в C

Строки реализуются посредством массивов символов. Поэтому объявление ASCII строки имеет следующий синтаксис:

char имя[длина];
Объявление строки в С имеет тот же синтаксис, что и объявление одномерного символьного массива. Длина строки должна представлять собой целочисленное значение (в стандарте C89 – константа, в стандарте C99 может быть выражением). Длина строки указывается с учетом одного символа на хранение завершающего нуля, поэтому максимальное количество значащих символов в строке на единицу меньше ее длины. Например, строка может содержать максимально двадцать символов, если объявлена следующим образом:
char str[21]; Инициализация строки в С осуществляется при ее объявлении, используя следующий синтаксис:
char str[длина] = строковый литерал;

Строковый литерал – строка ASCII символов заключенных в двойные кавычки. Примеры объявления строк с инициализацией:

char str1[20] = «Введите значение: «, str2[20] = «»;

const char message[] = «Сообщение об ошибке!»;

Работа со строками в С

Так как строки на языке С являются массивами символов, то к любому символу строки можно обратиться по его индексу. Для этого используется синтаксис обращения к элементу массива, поэтому первый символ в строке имеет индекс ноль. Например, в следующем фрагменте программы в строке str осуществляется замена всех символов ‘a’ на символы ‘A’ и наоборот.

Массивы строк в С

Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис:
char имя[количество][длина];

Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:

При объявлении массивов строк можно производить инициализацию:
char имя[количество][длина] = <строковый литерал №1, . строковый литерал №N>;

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

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

Функции для работы со строками в С

Все библиотечные функции, предназначенные для работы со строками, можно разделить на три группы:

  1. ввод и вывод строк;
  2. преобразование строк;
  3. обработка строк.

Ввод и вывод строк в С

Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид:

char str[31] = «»;
printf(«Введите строку: «);
scanf(«%30s”,str);
printf(«Вы ввели: %s”,str);

Недостатком функции scanf при вводе строковых данных является то, что символами разделителями данной функции являются:

  1. перевод строки,
  2. табуляция;
  3. пробел.

Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение».
Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.

Функция gets предназначена для ввода строк и имеет следующий заголовок:
char * gets(char *buffer);

Между тем использовать функцию gets категорически не рекомендуется, ввиду того, что она не контролирует выход за границу строки, что может произвести к ошибкам. Вместо нее используется функция fgets с тремя параметрами:

char * fgets(char * buffer, int size, FILE * stream);

где buffer — строка для записи результата, size — максимальное количество байт, которое запишет функция fgets, stream — файловый объект для чтения данных, для чтения с клавиатуры нужно указать stdin. Эта функция читает символы со стандартного ввода, пока не считает n — 1 символ или символ конца строки, потом запишет считанные символы в строку и добавит нулевой символ. При этом функция fgets записывает в том символ конца строки в данную строку, что нужно учитывать.

Функция puts предназначена для вывода строк и имеет следующий заголовок:
int puts(const char *string);

Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид:

Для считывания одного символа можно использовать функцию fgetc(FILE * stream) . Она считывает один символ и возвращает значение этого символа, преобразованное к типу int, если же считывание не удалось, то возвращается специальная константа EOF, равная -1. Функция возвращает значение -1 для того, чтобы можно было обрабатывать ситуацию конца файла, посимвольное чтение до конца файла можно реализовать следующим образом:

int c;
while ((c = fgetc(stdin)) != EOF) <
// Обработка символа
>

Для вывода одного символа можно использовать функцию int fputc(int c, FILE *stream); .

Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок:

int sscanf(const char * restrict buffer, const char * restrict string, [address] . );

Функции форматированного вывода в строку имеют следующие заголовки:

Преобразование строк

В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h
предусмотрен следующий набор функций:
double atof(const char *string); // преобразование строки в число типа double
int atoi(const char *string); // преобразование строки в число типа int
long int atol(const char *string); // преобразование строки в число типа long int
long long int atoll(const char *string); // преобразование строки в число типа long long int

Корректное представление вещественного числа в текстовой строке должно удовлетворять формату:

После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату:

Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа:

Аналогичные функции присутствуют и для преобразования строк в целочисленные значения:

Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf.

Обработка строк

В библиотеке string.h содержаться функции для различных действий над строками.
Функция вычисления длины строки:
size_t strlen(const char *string);

Функции копирования строк:

Функции сравнения строк:

Функции осуществляют сравнение строк по алфавиту и возвращают:

положительное значение – если string1 больше string2;
отрицательное значение – если string1 меньше string2;
нулевое значение – если string1 совпадает с string2;

Функции объединения (конкатенации) строк:

Функции поиска символа в строке:

Функция поиска строки в строке:
char * strstr(const char *str, const char *substr);

Функция поиска первого символа в строке из заданного набора символов:
size_t strcspn(const char *str, const char *charset);

Функции поиска первого символа в строке не принадлежащему заданному набору символов:
size_t strspn(const char *str, const char *charset);

Функции поиска первого символа в строке из заданного набора символов:
char * strpbrk(const char *str, const char *charset);

Функция поиска следующего литерала в строке:
char * strtok(char * restrict string, const char * restrict charset);

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

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