Строки в C и C++
C хранит текст в массивах char, которые заканчиваются скрытым символом '\0', а C++ оборачивает текст в std::string, который сам управляет памятью.
Что такое Строки в C и C++?
C хранит текст в массивах char, которые заканчиваются скрытым символом '\0', а C++ оборачивает текст в std::string, который сам управляет памятью.
Сравните массивы символов C и std::string в C++: длина, соединение, сравнение и поиск.
Важные моменты
- Включайте предупреждения компилятора и исправляйте их.
- Знайте тип и lifetime каждого значения.
- Проверяйте ввод и границы массивов.
Примеры кода на C и C++
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void) {
/* A C string is a char array that ends with '\0'. */
char name[32] = "Ada";
printf("%s has %zu letters\n", name, strlen(name));
/* strcat appends; the array must have room for the result. */
strcat(name, " Lovelace");
printf("%s\n", name);
/* strcmp returns 0 when two strings are equal. */
printf("equal: %d\n", strcmp("cat", "cat") == 0);
/* Walk the characters until the terminating '\0'. */
char upper[32];
size_t i = 0;
for (; name[i] != '\0'; i++) {
upper[i] = (char)toupper((unsigned char)name[i]);
}
upper[i] = '\0';
printf("%s\n", upper);
/* strstr finds a substring and returns a pointer to it, or NULL. */
printf("contains \"love\": %s\n", strstr("lovelace", "love") ? "yes" : "no");
return 0;
}
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
// std::string manages its own memory and grows as needed.
std::string name = "Ada";
std::cout << name << " has " << name.size() << " letters\n";
name += " Lovelace";
std::cout << name << '\n';
// == compares the contents of two strings.
std::cout << "equal: " << (std::string("cat") == "cat") << '\n';
std::string upper = name;
std::transform(upper.begin(), upper.end(), upper.begin(),
[](unsigned char c) { return static_cast<char>(std::toupper(c)); });
std::cout << upper << '\n';
// find returns std::string::npos when the text is missing.
std::string word = "lovelace";
std::cout << "contains \"love\": " << (word.find("love") != std::string::npos ? "yes" : "no") << '\n';
std::cout << "first name: " << name.substr(0, 3) << '\n';
}
Ada has 3 letters
Ada Lovelace
equal: 1
ADA LOVELACE
contains "love": yes
first name: Ada
Сравнение C и C++
В C функции strlen, strcat, strcmp и strstr работают с «сырыми» массивами, и вы сами следите, чтобы массив был достаточно большим. std::string даёт size(), +=, ==, find() и substr() и растёт автоматически, что защищает от переполнения буфера.
C явно показывает небольшие процедурные API и представление данных.
C++ сохраняет низкоуровневую модель и добавляет безопасные типы.
Практические задания
Запустите обе версии и изменяйте их, сравнивая гарантии языков.
- Добавьте неверные и граничные значения.
- Компилируйте с -Wall -Wextra -Wpedantic.
- Разделите объявления и реализацию.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Подсчёт заглавных букв Посчитайте количество заглавных букв в тексте. Легко
- Initials From a Name Build uppercase initials from a full name. Легко
- Replace Spaces With Dashes Turn spaces into dashes to make a URL-style slug. Легко