String em Linguagem C
Em C, as strings são tratadas como arrays de caracteres terminados por um caractere nulo (‘\0’), também conhecido como caractere de terminação de string. Este caractere nulo é crucial, pois indica onde a string termina, permitindo que funções da biblioteca padrão de C, como printf, strcpy, strlen, entre outras, saibam até onde ler ou manipular a string. Vamos explorar os conceitos fundamentais e características das strings em C, acompanhados de exemplos práticos.
Declaração e Inicialização de Strings
Uma string em C pode ser declarada como um array de caracteres:
Como Array de Caracteres
char minhaString[6] = "hello";
Neste caso, minhaString é um array de 6 caracteres, incluindo o caractere nulo automático ao final da string literal “hello”.
Usando Notação de String Literal
char minhaString[] = "hello";
Aqui, o tamanho do array minhaString é determinado automaticamente pelo compilador para ser 6, incluindo o caractere nulo.
Acessando e Modificando Caracteres
Você pode acessar ou modificar os caracteres individuais de uma string usando a indexação de array.
Exemplo de Acesso
char letra = minhaString[1]; // Acessa o segundo caractere da string, que é 'e'.
Exemplo de Modificação
minhaString[0] = 'H'; // Modifica o primeiro caractere de "hello" para "Hello".
Funções Comuns de Manipulação de Strings
A biblioteca padrão de C inclui várias funções para manipular strings, que requerem a inclusão do cabeçalho <string.h>. Algumas das funções mais usadas incluem:
strlen: Retorna o comprimento de uma string, não incluindo o caractere nulo.
int len = strlen(minhaString); // Calcula o comprimento de minhaString.
strcpy: Copia uma string para outra.
char destino[6];
strcpy(destino, minhaString); // Copia minhaString para destino.
strcat: Concatena duas strings, anexando a segunda à primeira.
char saudacao[11] = "Olá, ";
strcat(saudacao, "Mundo"); // Resulta em "Olá, Mundo" em saudacao.
strcmp: Compara duas strings lexicograficamente.
#include <stdio.h>
#include <string.h>
int main() {
char minhaString[] = "hello";
int resultado = strcmp(minhaString, "hello");
if (resultado == 0) {
printf("As strings são iguais.\n");
}
else if (resultado < 0) {
printf("A primeira string é lexicograficamente menor que a segunda.\n");
} else {
printf("A primeira string é lexicograficamente maior que a segunda.\n");
}
return 0;
}
Exercícios
Exercício 1: Contar Caracteres
Escreva um programa em C que leia uma string do usuário e exiba o número de caracteres na string.
Exercício 2: Comparar Strings
Crie um programa em C que compare duas strings inseridas pelo usuário e informe se elas são iguais ou diferentes.
Exercício 3: Concatenar Strings
Desenvolva um programa em C que concatene duas strings fornecidas pelo usuário sem usar a função strcat da biblioteca string.h.
Exercício 4: Inverter String
Elabore um programa em C que leia uma string e a imprima invertida.
Exercício 5: Contar Vogais
Escreva um programa em C que conte o número de vogais em uma string fornecida pelo usuário.
Exercício 6: Substring
Crie um programa em C que, dada uma string e dois índices, imprima a substring correspondente aos índices fornecidos.
Exercício 7: Verificar Palíndromo
Desenvolva um programa em C que verifique se uma string é um palíndromo (a string é igual se lida de trás para frente).
Exercício 8: Substituir Caracteres
Elabore um programa em C que substitua todas as ocorrências de um determinado caractere em uma string por outro caractere fornecido pelo usuário.
Exercício 9: Contar Palavras
Escreva um programa em C que conte o número de palavras em uma string fornecida pelo usuário.
Exercício 10: Primeira Letra de Cada Palavra em Maiúsculo
Crie um programa em C que transforme a primeira letra de cada palavra de uma string em maiúscula.
//1) #include <stdio.h> #include <string.h> int main() { char str[100]; printf("Digite uma string: "); fgets(str, 100, stdin); // Lê a string, incluindo espaços printf("Número de caracteres: %ld\n", strlen(str) - 1); // Subtrai 1 para não contar o '\n' return 0; }
//2) #include <stdio.h> #include <string.h> int main() { char str1[100], str2[100]; printf("Digite a primeira string: "); fgets(str1, 100, stdin); printf("Digite a segunda string: "); fgets(str2, 100, stdin); if (strcmp(str1, str2) == 0) printf("As strings são iguais.\n"); else printf("As strings são diferentes.\n"); return 0; }
//3) #include <stdio.h> #include <string.h> int main() { char str1[100], str2[100]; printf("Digite a primeira string: "); fgets(str1, 100, stdin); str1[strlen(str1) - 1] = '\0'; // Remove o '\n' printf("Digite a segunda string: "); fgets(str2, 100, stdin); strcat(str1, str2); printf("String concatenada: %s", str1); return 0; }
//4) #include <stdio.h> #include <string.h> int main() { char str[100], rev[100]; printf("Digite uma string: "); fgets(str, 100, stdin); int j = 0; for (int i = strlen(str) - 2; i >= 0; i--) { // Começa em strlen(str) - 2 para ignorar '\n' rev[j++] = str[i]; } rev[j] = '\0'; printf("String invertida: %s\n", rev); return 0; }
//5) #include <stdio.h> #include <string.h> int main() { char str[100]; printf("Digite uma string: "); fgets(str, 100, stdin); int count = 0; for (int i = 0; str[i]; i++) { char c = tolower(str[i]); if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') { count++; } } printf("Número de vogais: %d\n", count); return 0; }
//6) #include <stdio.h> #include <string.h> int main() { char str[100], substr[100]; int start, end; printf("Digite uma string: "); fgets(str, 100, stdin); printf("Digite o índice inicial e final: "); scanf("%d %d", &start, &end); strncpy(substr, &str[start], end - start + 1); substr[end - start + 1] = '\0'; printf("Substring: %s\n", substr); return 0; }
//7) #include <stdio.h> #include <string.h> #include <stdbool.h> bool isPalindrome(char str[]) { int length = strlen(str) - 1; // Ignora '\n' for (int i = 0; i < length / 2; i++) { if (str[i] != str[length - i - 1]) { return false; } } return true; } int main() { char str[100]; printf("Digite uma string: "); fgets(str, 100, stdin); if (isPalindrome(str)) printf("A string é um palíndromo.\n"); else printf("A string não é um palíndromo.\n"); return 0; }
//8) #include <stdio.h> #include <string.h> int main() { char str[100], original, substituto; printf("Digite uma string: "); fgets(str, 100, stdin); printf("Digite o caractere a ser substituído seguido pelo substituto: "); scanf(" %c %c", &original, &substituto); // Espaço antes de %c para ignorar '\n' anterior for (int i = 0; str[i]; i++) { if (str[i] == original) { str[i] = substituto; } } printf("String modificada: %s", str); return 0; }
//9) #include <stdio.h> #include <string.h> int main() { char str[100]; int count = 0; printf("Digite uma string: "); fgets(str, 100, stdin); for (int i = 0; str[i]; i++) { if (str[i] == ' ' || str[i] == '\n') { count++; } } printf("Número de palavras: %d\n", count); return 0; }
//10) #include <stdio.h> #include <string.h> int main() { char str[100]; printf("Digite uma string: "); fgets(str, sizeof(str), stdin); str[0] = toupper(str[0]); // Primeira letra da string for (int i = 1; str[i]; i++) { if (str[i - 1] == ' ') { str[i] = toupper(str[i]); } } printf("String modificada: %s", str); return 0; }