C++: Strings no Estilo C
Última atualização: 2026-08-26
C++ possui dois tipos de strings:
- Strings no estilo C (arrays de caracteres)
- String C++ (coberto mais tarde)
Esta aula aborda strings no estilo C primeiro — elas são uma herança do C que C++ mantém por compatibilidade. Entendê-las ajuda a compreender os princípios subjacentes das strings.
1. O que é uma String no Estilo C?
(1) 1.1 Essência: Array de Caracteres + Terminador Nulo
Uma string no estilo C é simplesmente um array de caracteres, com uma regra especial:
- O último caractere deve ser
\0(caractere nulo, código ASCII 0) \0marca o fim da string
"Hello" na memória:
+---+---+---+---+---+----+
| H | e | l | l | o | \0 |
+---+---+---+---+---+----+
0 1 2 3 4 5 ← índices
💡 Ponto-chave: O comprimento de uma string no estilo C é 5 (Hello), mas o tamanho do array deve ser pelo menos 6 (para armazenar \0).
2. Declaração e Inicialização
(1) 2.1 Declarando uma String no Estilo C
Sintaxe:
char nomeString[Tamanho];
Exemplo:
▶ Exemplo 2: Prática Básica de Programação (Dificuldade ⭐)
#include <iostream>
int main() {
char name[20]; // Pode armazenar 19 caracteres + 1 \0
name[0] = 'H';
name[1] = 'e';
name[2] = 'l';
name[3] = 'l';
name[4] = 'o';
name[5] = '\0'; // Não esqueça o terminador nulo!
std::cout << "Name: " << name << std::endl; // Hello
return 0;
}
Saída:
Name: Hello
💡 Dica: Adicionar \0 manualmente é tedioso — você aprenderá métodos mais simples depois.
(2) 2.2 Inicializando uma String no Estilo C
Método 1: Inicializar com uma string literal
#include <iostream>
int main() {
char name[] = "Hello"; // ✅ Compilador adiciona \0 automaticamente, tamanho do array é 6
std::cout << "Name: " << name << std::endl;
return 0;
}
💡 Ponto-chave: Ao inicializar com uma string literal, você não precisa especificar o tamanho do array — o compilador calcula automaticamente (incluindo \0).
3. Funções Comuns de Strings
Funções de strings no estilo C estão no arquivo de cabeçalho cstring.
(1) 3.1 strlen: Calcular o Comprimento da String
#include <iostream>
#include <cstring> // Deve incluir este cabeçalho
int main() {
char name[] = "Hello";
std::cout << "String: " << name << std::endl;
std::cout << "Length: " << std::strlen(name) << std::endl; // 5(excluindo \0)
return 0;
}
💡 Dica: std::strlen retorna o número de caracteres efetivos (excluindo \0), enquanto sizeof retorna o tamanho do array (incluindo \0).
char name[] = "Hello";
std::cout << sizeof(name) << std::endl; // 6(Tamanho do array)
std::cout << std::strlen(name) << std::endl; // 5(contagem de caracteres efetivos)
(2) 3.2 strcpy: Copiar uma String
#include <iostream>
#include <cstring>
int main() {
char src[] = "Hello";
char dest[20];
std::strcpy(dest, src); // Copia src para dest
std::cout << "src:" << src << std::endl;
std::cout << "dest:" << dest << std::endl;
return 0;
}
⚠️ Aviso: std::strcpy não verifica o tamanho do array de destino — se dest for muito pequeno, causará um estouro de buffer!
Função mais segura (após C++11):
std::strncpy(dest, src, sizeof(dest) - 1); // Copia no máximo sizeof(dest)-1 caracteres
dest[sizeof(dest) - 1] = '\0'; // Adiciona terminador nulo manualmente
(3) 3.3 strcat: Concatenar Strings
#include <iostream>
#include <cstring>
int main() {
char greeting[50] = "Hello, ";
char name[] = "World";
std::strcat(greeting, name); // Acrescenta name ao final de greeting
std::cout << greeting << std::endl; // Hello, World
return 0;
}
(4) 3.4 strcmp: Comparar Strings
#include <iostream>
#include <cstring>
int main() {
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "World";
std::cout << "strcmp(str1, str2) = " << std::strcmp(str1, str2) << std::endl;
std::cout << "strcmp(str1, str3) = " << std::strcmp(str1, str3) << std::endl;
return 0;
}
Valores de retorno:
0: as duas strings são iguais< 0: a primeira string é menor que a segunda> 0: a primeira string é maior que a segunda
💡 Dica: Não use == para comparar strings no estilo C! == compara endereços, não conteúdo.
char str1[] = "Hello";
char str2[] = "Hello";
if (str1 == str2) { // ❌ Erro: Comparando endereços, não conteúdo
// ...
}
if (std::strcmp(str1, str2) == 0) { // ✅ Correto:Use strcmp para comparar conteúdo
// ...
}
4. Manipulando Strings no Estilo C com cin e cout
(1) 4.1 Lendo Strings
#include <iostream>
int main() {
char name[20];
std::cout << "Por favor, digite seu nome: ";
std::cin >> name; // ✅ Pode ler strings (mas sem espaços)
std::cout << "Olá," << name << "!" << std::endl;
return 0;
}
💡 Problema: cin >> para no espaço em branco! Se você digitar "John Smith", ele só lê "John".
Solução: Use std::cin.getline
#include <iostream>
int main() {
char name[50];
std::cout << "Por favor, digite seu nome completo: ";
std::cin.getline(name, 50); // ✅ Lê a linha inteira (incluindo espaços)
std::cout << "Olá," << name << "!" << std::endl;
return 0;
}
5. Prática: Processamento Simples de Strings
▶ Exemplo 1: Contando Vogais em uma String (Dificuldade ⭐⭐)
#include <iostream>
#include <cstring>
int main() {
char str[100];
std::cout << "Por favor, digite uma string: ";
std::cin.getline(str, 100);
int vowels = 0;
for (int i = 0; i < std::strlen(str); i++) {
char c = str[i];
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||
c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
vowels++;
}
}
std::cout << "Contagem de vogais: " << vowels << std::endl;
return 0;
}
Saída:
Por favor, digite uma string:
Contagem de vogais:
Resultado da execução:
Por favor, digite uma string: Hello World
Contagem de vogais: 3
6. Erros Comuns
(1) 6.1 Esquecer de Deixar Espaço para \0
Exemplo de erro:
#include <iostream>
int main() {
char name[5] = "Hello"; // ❌ Erro: "Hello" precisa de 6 caracteres (incluindo \0), mas tamanho do array é apenas 5
std::cout << name << std::endl;
return 0;
}
Correção:
char name[6] = "Hello"; // ✅ Correto:Tamanho do array deve ser pelo menos 6
(2) 6.2 Usar = para Atribuir uma String
Exemplo de erro:
#include <iostream>
int main() {
char str1[20];
char str2[] = "Hello";
str1 = str2; // ❌ Erro: Não é possível atribuir a um array
str1 = "World"; // ❌ Erro: Não é possível atribuir a um array
return 0;
}
Correção: Use strcpy
#include <iostream>
#include <cstring>
int main() {
char str1[20];
char str2[] = "Hello";
std::strcpy(str1, str2); // ✅ Correto:Use strcpy para copiar
std::cout << str1 << std::endl;
return 0;
}
❓ Perguntas Frequentes
P: Quando devo usar strings no estilo C, e quando devo usar strings C++? R: Prefira strings C++ (coberto mais tarde), a menos que: > 1. Você esteja mantendo código legado (código C) > 2. Você esteja fazendo otimização de baixo nível (strings no estilo C são mais eficientes)
Strings C++ são mais seguras e fáceis de usar; recomendadas para iniciantes.
P: Por que
char name[] = "Hello"funciona, masint arr[] = {1, 2, 3}não funciona? R: Apenas strings literais podem inicializar diretamente arrays de caracteres.CPPchar name[] = "Hello"; // OK int arr[] = {1, 2, 3}; // OK(esta é uma lista de inicializadores, não uma string literal)
P: Como converto uma string no estilo C para uma string C++?
R: Você pode atribuir diretamente (o construtor da string C++ faz a conversão automaticamente).
CPP#include `<iostream>` #include `<string>` int main() { char cstr[] = "Hello"; std::string cppStr = cstr; // Conversão automática std::cout << cppStr << std::endl; return 0; }
▶ Exemplo 3: Comprimento e Cópia de String (Dificuldade ⭐)
#include <iostream>
#include <cstring>
int main() {
char src[] = "Hello";
char dest[20];
std::cout << "Comprimento de src: " << strlen(src) << std::endl;
strcpy(dest, src);
std::cout << "Após cópia: " << dest << std::endl;
return 0;
}
Saída:
Comprimento de src: 5
Após cópia: Hello
strlen() para obter o comprimento e strcpy() para copiar. Certifique-se de que o array de destino seja grande o suficiente!
📖 Resumo
- Strings no estilo C são arrays de caracteres terminados por
\0 - Funções comuns:
strlen(comprimento),strcpy(cópia),strcat(concatenação),strcmp(comparação) - Não use
==para comparar strings no estilo C — usestrcmp - Não use
=para atribuir strings no estilo C — usestrcpy - Strings no estilo C são inseguras (propensas a estouro de buffer); prefira strings C++
📝 Exercícios
-
Básico (Dificuldade ⭐): Declare uma string no estilo C
char str[] = "Hello, World!", depois exiba seu comprimento e cada caractere. -
Intermediário (Dificuldade ⭐⭐): Escreva um programa que permita ao usuário digitar duas strings e compare se elas são iguais (usando
strcmp). -
Desafio (Dificuldade ⭐⭐⭐): Escreva um programa que implemente "inversão de string":
-
Deixe o usuário digitar uma string
-
Inverta-a (ex:
"Hello"se torna"olleH") -
Implemente usando strings no estilo C (não use string C++)
- Strings no estilo C: arrays de caracteres terminados por \0
- Funções comuns: strlen/strcpy/strcat/strcmp
- Strings C são inicializadas com aspas duplas; arrays char devem reservar espaço para \0
- Desvantagens: inseguras (estouro de buffer), trabalhosas de manipular
- C++ moderno recomenda usar std::string em vez de strings no estilo C
7. 🚀 Próximo Passo
Agora que você aprendeu strings no estilo C, vamos avançar para String C++ (Aula 19) — uma classe de string mais segura e fácil de usar!