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 ⭐)

TEXT 📖 Somente leitura
string.erase(startPos, deleteCount);

Saída:

TEXT 📖 Somente leitura
(program output)

Exemplo:

CPP
#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:

TEXT 📖 Somente leitura
string.insert(insertion position, string to insert);

Exemplo:

CPP
#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)

CPP
#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

CPP
#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:

💡 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)

CPP
#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:

CPP
#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

CPP
#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)

CPP
#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 ⭐⭐)

CPP
#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;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
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 ⭐)

CPP
#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;
}
▶ Experimente

Saída:

TEXT 📖 Somente leitura
part1: 
part2: 
part3: 

❓ Perguntas Frequentes

P: Por que devo usar size_t em vez de int ao iterar sobre uma string? R: Porque string::length() retorna size_t (um inteiro sem sinal). Usar int pode produzir avisos ao comparar (com sinal vs. sem sinal).

Abordagem recomendada:

CPP
for (size_t i = 0; i < text.length(); i++) { ... }

Ou simplesmente use for baseado em intervalo (não precisa se preocupar com tipos de índice):

CPP
for (char c : text) { ... }

P: O que acontece quando a conversão stoi falha? R: Ela lança uma exceção std::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: Porque length() 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.

CPP
std::string s = "Hello";
std::cout << s.length() << std::endl; // 6 (not 2)

Solução: Use std::wstring (caracteres largos) ou bibliotecas de terceiros (como iconv).


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Escreva um programa que permita ao usuário inserir uma string, depois remova todos os espaços dela.
TEXT 📖 Somente leitura
Input: Hello World, this is C++!
Output: HelloWorld,thisisC++!
  1. 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").

  2. Dica: Você pode usar dois ponteiros (ou índices), um avançando e outro recuando, comparando caracteres um a um.

  3. Desafio (Dificuldade ⭐⭐⭐): Escreva um programa que implemente "criptografia/descriptografia simples":

  4. Regra de criptografia: adicione 3 ao código ASCII de cada caractere (por exemplo, 'A''D')

  5. Regra de descriptografia: subtraia 3 do código ASCII de cada caractere

  6. Permita que o usuário insira uma string, criptografe, depois descriptografe, e exiba o resultado


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!

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%