C++: Manipulação Avançada de Strings
Última atualização: 2026-08-26
Na lição 19 aprendemos o básico de operações com strings.
Mas em cenários do mundo real, você pode precisar deletar caracteres, inserir caracteres, comparar strings, converter números para strings...
Nesta lição, vamos aprender operações avançadas com strings.
1. Modificando Strings
(1) 1.1 Deletando Caracteres (erase)
Sintaxe:
▶ Exemplo 2: Exemplo de Código (Dificuldade ⭐)
string.erase(startPos, deleteCount);
Saída:
(program output)
Exemplo:
#include <iostream>
#include <string>
int main() {
std::string text = "Hello, World!";
// Delete 7 characters starting from position 5 (", World")
text.erase(5, 7);
std::cout << text << std::endl; // Hello!
return 0;
}
💡 Dica: Se você passar apenas um argumento, erase(pos) deleta todos os caracteres de pos até o final.
(2) 1.2 Inserindo Caracteres (insert)
Sintaxe:
string.insert(insertion position, string to insert);
Exemplo:
#include <iostream>
#include <string>
int main() {
std::string text = "Hello!";
// Insert " World" before the 5th character
text.insert(5, " World");
std::cout << text << std::endl; // Hello World!
return 0;
}
(3) 1.3 Limpando uma String (clear)
#include <iostream>
#include <string>
int main() {
std::string text = "Hello";
text.clear(); // Clear the string
std::cout << "Length: " << text.length() << std::endl; // 0
std::cout << "Is empty: " << text.empty() << std::endl; // 1 (true)
return 0;
}
💡 Dica: A função empty() verifica se uma string está vazia (retorna true, ou seja, 1, se vazia).
2. Comparando Strings (compare)
Embora você possa comparar strings usando ==, !=, <, >, a função compare() fornece informações mais detalhadas.
(1) 2.1 Uso Básico
#include <iostream>
#include <string>
int main() {
std::string s1 = "apple";
std::string s2 = "banana";
int result = s1.compare(s2);
if (result == 0) {
std::cout << "s1 equals s2" << std::endl;
} else if (result < 0) {
std::cout << "s1 is less than s2" << std::endl; // This line executes
} else {
std::cout << "s1 is greater than s2" << std::endl;
}
return 0;
}
Valores de retorno:
0: as duas strings são iguais< 0: o chamador é menor que o argumento> 0: o chamador é maior que o argumento
💡 Dica: Na prática, usar ==, !=, <, > diretamente para comparar strings é mais intuitivo — esses operadores são recomendados.
3. Convertendo Entre Strings e Números
(1) 3.1 Números para Strings (to_string)
#include <iostream>
#include <string>
int main() {
int age = 25;
double price = 19.99;
std::string ageStr = std::to_string(age);
std::string priceStr = std::to_string(price);
std::cout << "Age: " << ageStr << std::endl;
std::cout << "Price: " << priceStr << std::endl;
return 0;
}
💡 Dica: to_string() preserva 6 casas decimais ao converter números de ponto flutuante. Se você precisa controlar o formato, use std::ostringstream ou std::format (C++20).
(2) 3.2 Strings para Números (stoi, stod)
| Função | Finalidade | Exemplo |
|---|---|---|
std::stoi(str) |
String → int | int x = std::stoi("123"); |
std::stol(str) |
String → long | long x = std::stol("123"); |
std::stoll(str) |
String → long long | long long x = std::stoll("123"); |
std::stof(str) |
String → float | float x = std::stof("3.14"); |
std::stod(str) |
String → double | double x = std::stod("3.14"); |
Exemplo:
#include <iostream>
#include <string>
int main() {
std::string numStr = "123";
std::string priceStr = "19.99";
int num = std::stoi(numStr);
double price = std::stod(priceStr);
std::cout << "num = " << num << std::endl;
std::cout << "price = " << price << std::endl;
return 0;
}
⚠️ Nota: Se a string não estiver em um formato numérico válido, stoi / stod lançarão uma exceção. Aprenderemos como lidar com isso usando try-catch mais tarde.
4. Iterando Sobre Strings
(1) 4.1 Usando Subscritos
#include <iostream>
#include <string>
int main() {
std::string text = "Hello";
for (size_t i = 0; i < text.length(); i++) {
std::cout << text[i] << " ";
}
std::cout << std::endl;
return 0;
}
(2) 4.2 Usando for Baseado em Intervalo (C++11, Recomendado)
#include <iostream>
#include <string>
int main() {
std::string text = "Hello";
for (char c : text) {
std::cout << c << " ";
}
std::cout << std::endl;
return 0;
}
💡 Dica: O for baseado em intervalo é mais conciso e menos propenso a erros nas condições do loop.
5. Prática: Editor de Texto Simples
▶ Exemplo 1: Implementando "Buscar e Substituir" (Dificuldade ⭐⭐)
#include <iostream>
#include <string>
int main() {
std::string text = "I like C. C is powerful.";
std::string oldStr = "C";
std::string newStr = "C++";
size_t pos = 0;
while ((pos = text.find(oldStr, pos)) != std::string::npos) {
text.replace(pos, oldStr.length(), newStr);
pos += newStr.length(); // Avoid infinite loop
}
std::cout << "After replacement: " << text << std::endl;
return 0;
}
Saída:
After replacement:
💡 Ponto-chave: Após substituir, pule a string recém-inserida; caso contrário você terá um loop infinito (se a nova string contiver a string antiga).
▶ Exemplo 3: Extraindo Substrings com substr (Dificuldade ⭐)
#include <iostream>
#include <string>
int main() {
std::string text = "Hello, C++ World!";
// Extract "Hello"
std::string part1 = text.substr(0, 5);
std::cout << "part1: " << part1 << std::endl;
// Extract "C++"
std::string part2 = text.substr(7, 3);
std::cout << "part2: " << part2 << std::endl;
// Extract from position 7 to the end
std::string part3 = text.substr(7);
std::cout << "part3: " << part3 << std::endl;
return 0;
}
Saída:
part1:
part2:
part3:
❓ Perguntas Frequentes
P: Por que devo usar
size_tem vez deintao iterar sobre uma string? R: Porquestring::length()retornasize_t(um inteiro sem sinal). Usarintpode produzir avisos ao comparar (com sinal vs. sem sinal).Abordagem recomendada:
CPPfor (size_t i = 0; i < text.length(); i++) { ... }Ou simplesmente use for baseado em intervalo (não precisa se preocupar com tipos de índice):
CPPfor (char c : text) { ... }
P: O que acontece quando a conversão
stoifalha? R: Ela lança uma exceçãostd::invalid_argument.CPP#include `<iostream>` #include `<string>` int main() { try { int x = std::stoi("abc"); // ❌ Not a number, throws exception } catch (const std::invalid_argument& e) { std::cout << "Conversion failed: " << e.what() << std::endl; } return 0; }(Abordaremos exceções em detalhes mais tarde — apenas esteja ciente disso por enquanto.)
P: Por que o
length()da minha string com caracteres especiais/acentuados parece errado? R: Porquelength()retorna o número de bytes, não o número de caracteres.Se o arquivo fonte estiver codificado em UTF-8, um caractere acentuado ocupa 3 bytes.
CPPstd::string s = "Hello"; std::cout << s.length() << std::endl; // 6 (not 2)Solução: Use
std::wstring(caracteres largos) ou bibliotecas de terceiros (comoiconv).
📖 Resumo
erase()deleta caracteres,insert()insere caracteres,clear()limpa a stringcompare()compara strings (mas usar==,!=etc. é recomendado)to_string()converte números para stringsstoi()/stod()converte strings para números- O
forbaseado em intervalo é recomendado para iterar sobre strings (C++11)
📝 Exercícios
- Básico (Dificuldade ⭐): Escreva um programa que permita ao usuário inserir uma string, depois remova todos os espaços dela.
Input: Hello World, this is C++!
Output: HelloWorld,thisisC++!
-
Intermediário (Dificuldade ⭐⭐): Escreva um programa que permita ao usuário inserir uma string e determine se ela é um "palíndromo" (lê o mesmo de trás para frente, por exemplo "level", "radar").
-
Dica: Você pode usar dois ponteiros (ou índices), um avançando e outro recuando, comparando caracteres um a um.
-
Desafio (Dificuldade ⭐⭐⭐): Escreva um programa que implemente "criptografia/descriptografia simples":
-
Regra de criptografia: adicione 3 ao código ASCII de cada caractere (por exemplo,
'A'→'D') -
Regra de descriptografia: subtraia 3 do código ASCII de cada caractere
-
Permita que o usuário insira uma string, criptografe, depois descriptografe, e exiba o resultado
- Busca: find/rfind/find_first_of para localizar substrings
- Extração: substr(pos, count) para extrair substrings
- Substituição: replace(pos, count, str) para substituir porções
- Inserção/Exclusão: insert/erase para modificar strings dinamicamente
- Conversão de tipo: stoi/stod/to_string para converter entre strings e números
6. 🚀 Próximos Passos
Agora que você aprendeu operações avançadas com strings, vamos avançar para Fase 4 (Ponteiros e Referências) — a parte mais "intimidadora" mas também mais importante do C++. Compreender memória é a chave para escrever código eficiente!