Инициализация строк
Массив символов (или расширенных символов) можно инициализировать со строковым литералом (или расширенным строковым литералом). Пример:
char code[ ] = "abc";
Этот код инициализирует символьный массив code с четырьмя элементами. Четвертым элементом является символ null, которым завершаются все строковые литералы.
Длина списка идентификаторов может быть равна количеству инициализируемых идентификаторов. Если указанный размер массива меньше длины строки, то лишние символы игнорируются. Например, следующее объявление инициализирует символьный массив code с тремя элементами:
char code[3] = "abcd";
Массиву code присваиваются только первые три символа инициализатора. Символ d и символ null, завершающий строки, отбрасываются. Обратите внимание, что при этом будет создана незавершенная строка (т. е. строка без значения 0, которым обозначается ее конец) и сгенерировано диагностическое сообщение, указывающее на это состояние.
char s[] = "abc", t[3] = "abc";
char s[] = , t[3] = ;
Если строка короче указанного размера массива, то остальные элементы массива инициализируются как равные 0.
Блок, относящийся только к системам Microsoft
В Microsoft C строковые литералы могут иметь длину до 2048 байт.
Завершение блока, относящегося только к системам Майкрософт
Как инициализировать си строку в конструкторе
@Sneiksus, Вам не нужно явно указывать модификатор доступа public — в структурах он используется по-умолчанию (к Вашему вопросу не относится, просто уточняю).
27 авг 2018 в 12:21
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вам необходимо либо убрать признак указателя ( char fieldName[20]; ), либо убрать размер ( char *fieldName; ) и выделять память в конструкторе и освобождать ее в деструкторе. Это различные подходы со своими особенностями и ограничениями, в которых так же стоит разобраться.
В обоих случаях стоит поэлементно скопировать строку, которая передается в качестве аргумента. Как уже подсказали в комментариях, это делается с помощью функции std::strcpy.
Отслеживать
ответ дан 27 авг 2018 в 11:23
8,656 1 1 золотой знак 16 16 серебряных знаков 32 32 бронзовых знака
- c++
- ооп
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Функции обработки строк в Cи
В программе строки могут определяться следующим образом:
- как строковые константы;
- как массивы символов;
- через указатель на символьный тип;
- как массивы строк.
Кроме того, должно быть предусмотрено выделение памяти для хранения строки.
Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .
Для корректного вывода любая строка должна заканчиваться нуль-символом ‘\0’ , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.
Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.
Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘\»‘ .
Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .
При определении массива символов необходимо сообщить компилятору требуемый размер памяти.
Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:
char m2[]= «Горные вершины спят во тьме ночной.» ;
char m3[]=< 'Т','и','х','и','е',' ','д','о','л','и','н','ы',' ','п','о','л','н','ы',' ','с','в','е','ж','е','й',' ','м','г','л','о','й','\0' >;
В этом случае имена m2 и m3 являются указателями на первые элементы массивов:
- m2 эквивалентно &m2[0]
- m2[0] эквивалентно ‘Г’
- m2[1] эквивалентно ‘o’
- m3 эквивалентно &m3[0]
- m3[2] эквивалентно ‘x’
При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:
char m2[80]= «Горные вершины спят во тьме ночной.» ;
Для задания строки можно использовать указатель на символьный тип .
В этом случае объявление массива переменной m4 может быть присвоен адрес массива:
m4 = m3;
*m4 эквивалентно m3[0]= ‘Т’
*(m4+1) эквивалентно m3[1]= ‘и’
Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .
Для указателя можно использовать операцию увеличения (перемещения на следующий символ):
Массивы символьных строк
Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.
char *poet[4] = < "Погиб поэт!", "- невольник чести -" ,
«Пал,» , «оклеветанный молвой…» >;
В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.
Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:
char poet[4][23];
Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.
Свободный массив
сhar *poet[4];
определяет свободный массив, где длина каждой строки определяется тем указателем, который эту строку инициализирует. Свободный массив не тратит память напрасно.
Операции со строками
Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:
- выделить блок оперативной памяти под массив;
- проинициализировать строку.
Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:
char *name;
name = ( char *)malloc(10);
scanf( «%9s» , name);
Для ввода строки использована функция scanf() , причем введенная строка не может превышать 9 символов. Последний символ будет содержать ‘\0’ .
Функции ввода строк
Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат «%s» для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.
Для ввода строки, включая пробелы, используется функция
char * gets( char *);
или её эквивалент
char * gets_s( char *);
В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.
Функции вывода строк
Для вывода строк можно воспользоваться рассмотренной ранее функцией
printf( «%s» , str); // str — указатель на строку
или в сокращенном формате
Для вывода строк также может использоваться функция
int puts ( char *s);
которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.
Функция ввода символов
Для ввода символов может использоваться функция
char getchar();
которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.
Функция вывода символов
Для вывода символов может использоваться функция
char putchar( char );
которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.
Пример Посчитать количество введенных символов во введенной строке.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
#include
#include
int main() char s[80], sym;
int count, i;
system( «chcp 1251» );
system( «cls» );
printf( «Введите строку : » );
gets_s(s);
printf( «Введите символ : » );
sym = getchar();
count = 0;
for (i = 0; s[i] != ‘\0’ ; i++)
if (s[i] == sym)
count++;
>
printf( «В строке\n» );
puts(s); // Вывод строки
printf( «символ » );
putchar(sym); // Вывод символа
printf( » встречается %d раз» , count);
getchar(); getchar();
return 0;
>

Результат выполнения
Основные функции стандартной библиотеки string.h
Основные функции стандартной библиотеки string.h приведены в таблице.
char *strcat( char *s1, char *s2)
char *strncat( char *s1, char *s2, int n)
char *strсpy( char *s1, char *s2)
char *strncpy( char *s1, char *s2, int n)
int strcmp( char *s1, char *s2)
int strncmp( char *s1, char *s2, int n)
int strlen( char *s)
char *strset( char *s, char c)
char *strnset( char *s, char c, int n)
Пример использования функций
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int main() char m1[80] = «Первая строка» ;
char m2[80] = «Вторая строка» ;
char m3[80];
system( «chcp 1251» );
system( «cls» );
strncpy(m3, m1, 6); // не добавляет ‘\0’ в конце строки
puts( «Результат strncpy(m3, m1, 6)» );
puts(m3);
strcpy(m3, m1);
puts( «Результат strcpy(m3, m1)» );
puts(m3);
puts( «Результат strcmp(m3, m1) равен» );
printf( «%d» , strcmp(m3, m1));
strncat(m3, m2, 5);
puts( «Результат strncat(m3, m2, 5)» );
puts(m3);
strcat(m3, m2);
puts( «Результат strcat(m3, m2)» );
puts(m3);
puts( «Количество символов в строке m1 равно strlen(m1) : » );
printf( «%d\n» , strlen(m1));
_strnset(m3, ‘f’ , 7);
puts( «Результат strnset(m3, ‘f’ , 7)» );
puts(m3);
_strset(m3, ‘k’ );
puts( «Результат strnset(m3, ‘k’ )» );
puts(m3);
getchar();
return 0;
>

Результат выполнения
Строки в C: как объявить и инициализировать строковые переменные в C
A Строка в C это не что иное, как набор символов в линейной последовательности. «C» всегда рассматривает строку как отдельные данные, даже если она содержит пробелы. Одиночный символ определяется с использованием одинарной кавычки. Строка представляется с использованием двойных кавычек.
Example, "Welcome to the world of programming!"
«C» предоставляет стандартную библиотеку который содержит множество функций, которые можно использовать для легкого выполнения сложных операций со строками в C.
Как объявить строку в C?
AC String — это простой массив с типом данных char. язык «С» не поддерживает напрямую строку как тип данных. Следовательно, чтобы отобразить строку в C, вам необходимо использовать массив символов.
Общий синтаксис объявления переменной как строки в C следующий:
char string_variable_name [array_size];
Классическое объявление строк можно выполнить следующим образом:
char string_name[string_length] = "string";
Размер массива должен быть определен при объявлении строковой переменной C, поскольку он используется для расчета количества символов, которые будут храниться внутри строковой переменной в C. Ниже приведены некоторые допустимые примеры объявления строк:
char first_name[15]; //declaration of a string variable char last_name[15];
В приведенном выше примере представлены строковые переменные с размером массива 15. Это означает, что данный строковый массив C способен содержать не более 15 символов. Индексация массива начинается с 0, поэтому в нем будут храниться символы с позиции 0–14. Компилятор C автоматически добавляет NULL-символ ‘\0’ в созданный массив символов.
Как инициализировать строку в C?
Давайте изучим инициализацию String в C.Follo.wing пример демонстрирует инициализацию строк в C,
char first_name[15] = "ANTHONY"; char first_name[15] = ; // NULL character '\0' is required at end in this declaration char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */ char string2 [ ] = "world"; /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */ char string3[6] = ; /*Declaration as set of characters ,Size 6*/
В строке 3 символ NULL должен быть добавлен явно, а символы заключены в одинарные кавычки.
«C» также позволяет нам инициализировать строковая переменная без определения размера массива символов. Это можно сделать в след.wing путь,
char first_name[ ] = "NATHAN";
Имя строки в C действует как указатель, поскольку по сути это массив.
Ввод строки C: программа C для чтения строки
При написании интерактивных программ, которые запрашивают ввод данных у пользователя, C предоставляет функции scanf(),gets() и fgets() для поиска строки текста, введенной пользователем.
Когда мы используем scanf() для чтения, мы используем спецификатор формата «%s» без использования «&» для доступа к адресу переменной, поскольку имя массива действует как указатель.
Например:
#include int main()
Вывод:
Enter your first name and age: John_Smith 48
Проблема с функцией scanf заключается в том, что она никогда не читает целые строки в C. Она останавливает процесс чтения, как только появляются пробелы, перевод страницы, вертикальная табуляция, новая строка или возврат каретки. Предположим, мы вводим входные данные как «Guru99 Tutorials», тогда функция scanf никогда не будет читать всю строку, поскольку между двумя именами встречается пробельный символ. Функция scanf будет читать только Guru99.
Чтобы прочитать строку, содержащую пробелы, мы используем функцию get(). Gets игнорирует пробелы. Это останавливает
чтение при достижении новой строки (нажата клавиша Enter).
Например:
#include int main()
Вывод:
Enter your full name: Dennis Ritchie My full name is Dennis Ritchie
Другой более безопасной альтернативой get() является функция fgets(), которая считывает указанное количество символов.
Например:
#include int main()
Вывод:
Enter your name plz: Carlos My name is Carlos
- имя строки,
- количество символов для чтения,
- stdin означает чтение со стандартного ввода, которым является клавиатура.
Вывод строки C: программа C для печати строки
Стандартная функция printf используется для печати или отображения строк на языке C на устройстве вывода. Используемый спецификатор формата: %s.
Пример,
printf("%s", name);
Вывод строк осуществляется с помощью функций fputs() и printf().
функция fputs()
Для функции fputs() требуется имя строки и указатель на то место, где вы хотите отобразить текст. Мы используем стандартный вывод, который относится к стандартному выводу для вывода на экран.
Например:
#include int main()
Вывод:
Enter your town: New York New York
помещает функцию
Функция puts используется для печати строки на языке C на устройстве вывода и перемещения курсора обратно в первую позицию. Функцию puts можно использовать ниже.wing путь,
#include int main() < char name[15]; gets(name); //reads a string puts(name); //displays a string return 0;>
Синтаксис этой функции сравнительно прост, чем у других функций.
Библиотека струн
Стандартная библиотека C предоставляет различные функции для управления строками в программе. Эти функции также называются обработчиками строк. Все эти обработчики присутствуют внутри заголовочный файл.
| Функция | Цель |
|---|---|
| strlen () | Эта функция используется для определения длины строки. Он возвращает количество символов в строке, исключая символ NULL. |
| стркат(строка1, строка2) | Эта функция используется для объединения двух строк в одну. Он добавляет или объединяет строку str2 в конец строки str1 и возвращает указатель на строку str1. |
| стркмп(строка1, строка2) | Эта функция используется для сравнения двух строк друг с другом. Он возвращает 0, если строка1 равна строке2, меньше 0, если строка1 < строка2, и больше 0, если строка1 >строка2. |
Давайте рассмотрим программу ниже, которая демонстрирует функции библиотеки строк:
#include #include int main () < //string initialization char string1[15]="Hello"; char string2[15]=" World!"; char string3[15]; int val; //string comparison val= strcmp(string1,string2); if(val==0)< printf("Strings are equal\n"); >else < printf("Strings are not equal\n"); >//string concatenation printf("Concatenated string:%s",strcat(string1,string2)); //string1 contains hello world! //string length printf("\nLength of first string:%d",strlen(string1)); printf("\nLength of second string:%d",strlen(string2)); //string copy printf("\nCopied string is:%s\n",strcpy(string3,string1)); //string1 is copied into string3 return 0; >
Вывод:
Strings are not equal Concatenated string:Hello World! Length of first string:12 Length of second string:7 Copied string is:Hello World!
Другие важные функции библиотеки:
- strncmp(str1, str2, n) : возвращает 0, если первые n символов строки str1 равны первым n символам строки str2, меньше 0, если str1 < str2, и больше 0, если str1 >str2.
- strncpy(str1, str2, n) Эта функция используется для копирования строки из другой строки. Копирует первые n символов строки str2 в строку str1.
- strchr(str1, c): возвращает указатель на первое появление символа c в строке str1 или NULL, если символ не найден.
- strrchr(str1, c): он ищет строку 1 в обратном порядке и возвращает указатель на позицию символа c в строке 1 или NULL, если символ не найден.
- strstr(str1, str2): возвращает указатель на первое вхождение строки str2 в строку str1 или NULL, если строка str2 не найдена.
- strncat(str1, str2, n) Добавляет (объединяет) первые n символов строки str2 в конец строки str1 и возвращает указатель на строку str1.
- strlwr(): преобразовать строку в нижний регистр
- strupr(): преобразовать строку в верхний регистр
- strrev(): перевернуть строку
Преобразование строки в число
В программировании на C мы можем преобразовать строку числовых символов в числовое значение, чтобы предотвратить ошибку во время выполнения. Библиотека stdio.h содержит следующееwing функции для преобразования строки в число:
- int atoi(str) Обозначает целое число от ASCII; он преобразует str в эквивалентное значение int. 0 возвращается, если первый символ не является числом или числа не встречаются.
- double atof(str) Обозначает ASCII как число с плавающей запятой, преобразует str в эквивалентное двойное значение. 0.0 возвращается, если первый символ не является числом или числа не встречаются.
- long int atol(str) Заменяет ASCII на long int. Преобразует str в эквивалентное длинное целое значение. 0 возвращается, если первый символ не является числом или числа не встречаются.
Фоллоwing программа демонстрирует функцию atoi():
#include int main()
Вывод:
Enter a number: 221348 you enter 221348
- Объявление указателя строки, такое как char *string = «language», является константой и не может быть изменено.
Итоги
- Строка — это последовательность символов, хранящаяся в массиве символов.
- Строка — это текст, заключенный в двойные кавычки.
- Такой символ, как «d», не является строкой и обозначается одинарными кавычками.
- «C» предоставляет стандартные библиотечные функции для управления строками в программе. Струнные манипуляторы хранятся в заголовочный файл.
- Строка должна быть объявлена или инициализирована перед использованием в программе.
- Существуют различные строковые функции ввода и вывода, каждая из которых имеет свои особенности.
- Не забудьте подключить библиотеку строк для работы с ее функциями.
- Мы можем преобразовать строку в число с помощью функций atoi(), atof() и atol(), которые очень полезны для процессов кодирования и декодирования.
- Мы можем манипулировать различными строками, определив массив строк в C.
- Динамическое распределение памяти в C с использованием функций malloc(), calloc()
- Приведение типов в C: преобразование типов, неявное, явное с примером
- Учебное пособие по программированию на C в формате PDF для начинающих
- 13 ЛУЧШИХ книг по программированию на C для начинающих (обновление 2024 г.)
- Разница между C и Java
- Разница между структурой и объединением в C
- 100 лучших вопросов и ответов на интервью по программированию на языке C (PDF)
- Функция calloc() в библиотеке C с ПРИМЕРОМ программы