Строки в C просто: объявление, ввод, вывод и библиотечные функции
Что такое строка в C?
Строка в C — непрерывная последовательность символов, оканчивающаяся нуль-символом (\0). Хотя в языке нет выделенного строкового типа, строка обычно представляется как массив значений char. Компилятор автоматически добавляет нуль-терминатор при инициализации строкового литерала.
"Welcome to the world of programming!"
Заголовочный файл стандартной библиотеки <string.h> предлагает множество функций для эффективной манипуляции строками.
Объявление и инициализация строк
Поскольку C рассматривает строку как массив символов, вы должны указать размер массива. Размер определяет максимальное количество символов (исключая нуль-терминатор), которые могут быть сохранены.
char string_variable_name[array_size];
Типичные объявления:
char first_name[15]; /* до 14 символов + \0 */ char last_name[15];
Когда вы предоставляете инициализатор, компилятор подсчитывает символы и автоматически добавляет нуль-терминатор. Размер массива может быть опущен, если вы даете инициализатор.
char first_name[15] = "ANTHONY"; char first_name[] = "NATHAN"; /* размер выводится автоматически */ char string3[6] = {'h','e','l','l','o','\0'}; /* явный терминатор */
Чтение строк от пользователя
Функции ввода различаются по безопасности и поведению:
scanf("%s", name)читает до пробела, но уязвима для переполнения буфера.gets()читает всю строку, но небезопасна и удалена из C11.fgets(name, size, stdin)читает доsize-1символов, оставляя место для нуль-терминатора.
Пример с fgets:
#include <stdio.h> int main() { char name[50]; printf("Enter your full name: "); fgets(name, sizeof(name), stdin); printf("Your name is %s", name); return 0; }
Вывод строк
Классический способ отображения строки — printf("%s", name);. Два удобных альтернативы:
fputs(name, stdout)— пишет напрямую в выходной поток.puts(name)— пишет строку с последующим переводом строки.
Пример с puts:
#include <stdio.h> int main() { char greeting[] = "Hello, world!"; puts(greeting); return 0; }
Библиотека строк (<string.h>)
Часто используемые функции:
| Функция | Описание |
|---|---|
| strlen | Возвращает длину строки (исключая нуль-терминатор). |
| strcat | Присоединяет одну строку к другой. |
| strcmp | Лексикографически сравнивает две строки. |
| strcpy | Копирует строку. |
| strncmp | Сравнивает до n символов. |
| strncpy | Копирует до n символов. |
| strchr | Находит первое вхождение символа. |
| strrchr | Находит последнее вхождение символа. |
| strstr | Находит подстроку. |
| strncat | Конкатенирует до n символов. |
| strlwr | Приводит к нижнему регистру (нестандартно). |
| strupr | Приводит к верхнему регистру (нестандартно). |
| strrev | Реверсирует строку (нестандартно). |
Иллюстративная программа:
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Hello"; char str2[20] = " World!"; char result[40]; /* Сравнение */ if (strcmp(str1, str2) == 0) puts("Strings are equal"); else puts("Strings are not equal"); /* Конкатенация */ strcat(str1, str2); // str1 теперь содержит "Hello World!" printf("Concatenated: %s\n", str1); /* Длина */ printf("Length of str1: %zu\n", strlen(str1)); /* Копирование */ strcpy(result, str1); printf("Copied string: %s\n", result); return 0; }
Преобразование строки в число
Стандартные преобразования:
atoi— преобразует вint.atof— преобразует вdouble.atol— преобразует вlong.
Пример с atoi:
#include <stdio.h> #include <stdlib.h> int main() { char number_str[20]; printf("Enter a number: "); fgets(number_str, sizeof(number_str), stdin); int num = atoi(number_str); printf("You entered %d\n", num); return 0; }
Ключевые выводы
- Строка — последовательность символов в массиве
char, завершаемая \0. - Объявляйте размер массива перед использованием или позвольте компилятору вывести его при инициализации.
- Используйте
fgetsдля безопасного ввода; избегайтеgetsиscanf("%s")без проверки границ. - Используйте
<string.h>для надежных операций со строками. - Преобразуйте строковые числа с
atoi,atofилиatolдля избежания ошибок выполнения. - Помните, что строковые литералы только для чтения; их модификация приводит к неопределенному поведению.
Язык C
- Освоение строк в Java: создание, методы и лучшие практики
- Строковые представления в Java Enums: настройка toString() и лучшие практики
- Создание списков строк в VHDL: лучшие практики и пример
- Массивы в C++: объявление, инициализация и работа с указателями
- Функции строк в C++: strcpy, strcat, strlen, strcmp — практические примеры
- Использование realloc() в C: синтаксис, лучшие практики и пример
- Освоение функции free() в C: практическое руководство и пример
- Метод String.length() в Java: как получить длину строки (пример)
- Освоение строковых операций в Python: replace, join, split, reverse, преобразование регистра
- Класс String в Java: создание, манипуляции и основные методы