Массивы и строки в C и C++
В этом уроке вы переберёте массив фиксированного размера и безопасно вычислите длину строки на C и C++.
Введение
Массив - это последовательность элементов одного типа, которые хранятся в памяти подряд. В C строка - это массив символов, который заканчивается нулевым символом '\0'. В C++ же std::string сам управляет своей памятью и всегда знает длину текста.
Главное
- Включите предупреждения компилятора (compiler warnings) и исправьте их все.
- Хорошо понимайте тип и время жизни (lifetime) каждого значения.
- Всегда проверяйте входные данные и границы индексов массивов.
Как это работает
Строка в C - это массив символов, который заканчивается '\0'. Щёлкните по символу, чтобы увидеть его индекс и адрес в памяти.
Примеры кода на C и C++
#include <stdio.h>
#include <string.h>
int main(void) {
int values[] = {3, 5, 8, 13};
char name[] = "Ada";
size_t count = sizeof values / sizeof values[0];
printf("%s: %zu values, %zu letters\n", name, count, strlen(name));
return 0;
}
Ada: 4 values, 3 letters
#include <array>
#include <iostream>
#include <string>
int main() {
std::array values{3, 5, 8, 13};
std::string name = "Ada";
std::cout << name << ": " << values.size()
<< " values, " << name.size() << " letters\n";
}
Ada: 4 values, 3 letters
Сравнение C и C++
Выражение sizeof values / sizeof values[0] вычисляет число элементов массива, объявленного в той же функции, но не работает с массивом, переданным в функцию как указатель. Функции strlen нужно пройти по всем символам до '\0', чтобы узнать длину, а std::string::size() возвращает её сразу.
C использует небольшие процедурные функции и открыто показывает, как данные представлены в памяти.
C++ по-прежнему позволяет работать на низком уровне, но добавляет библиотечные типы и более безопасные абстракции.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Проверьте неверный ввод и граничные значения.
- Скомпилируйте с флагами -Wall -Wextra -Wpedantic, чтобы включить больше предупреждений.
- Вынесите общие объявления в заголовочный файл, а реализацию в отдельный файл.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Сумма массива Сложите все значения в списке. Легко
- Развернуть строку Верните символы строки в обратном порядке. Легко