Vamos a mais uma dúvida aqui em nosso Curso de Programação C? E a dúvida de hoje é como fazer uma função para inverter uma string em C?
Vou apresentar duas abordagens.
A primeira abordagem é inverter a string no próprio vetor, ou seja, sem fazer uma cópia. A ideia é utilizar dois índices, um início inicializado com o valor zero e outro fim com o índice do último caracter da string e, dentro de uma repetição, ir trocando os elementos destas posições e, a cada troca, início é incrementado e fim é decrementado. É esta lógica que foi implementada no trecho de código a seguir:
void inverter(char vet[]){ int i, aux, fim, tam = strlen(vet); fim = tam - 1; // índice do último caracter for(i = 0; i < tam/2; i++){ aux = vet[i]; vet[i] = vet[fim]; vet[fim] = aux; fim--; } }
A segunda abordagem consiste em copiar a string para um segundo vetor, invertendo a ordem enquanto copiamos. Como a dúvida diz “devolve o nome invertido”, podemos fazer uma função que retorna o ponteiro para a nova string invertida, como feito a seguir:
char* inverter2(char vet[]){ int i, aux, fim, tam = strlen(vet); char *novo = malloc((tam + 1) * sizeof(char)); fim = tam - 1; // índice do último caracter for(i = 0; i < tam; i++){ novo[fim] = vet[i]; fim--; } novo[i] = '\0'; // finaliza a nova string return novo; }
Código de exemplo completo em C
/* Aula 205: Dúvida Código escrito por Wagner Gaspar Junho de 2021 Dúvida: Faça uma função que recebe um nome e devolve o nome invertido. */ void inverter(char vet[]){ int i, aux, fim, tam = strlen(vet); fim = tam - 1; for(i = 0; i < tam/2; i++){ aux = vet[i]; vet[i] = vet[fim]; vet[fim] = aux; fim--; } } char* inverter2(char vet[]){ int i, aux, fim, tam = strlen(vet); char *novo = malloc((tam + 1) * sizeof(char)); fim = tam - 1; for(i = 0; i < tam; i++){ novo[fim] = vet[i]; fim--; } novo[i] = '\0'; return novo; } int main(){ char palavra[25] = {"Muito bem feito!"}; char *p; printf("%s\n", palavra); //inverter(palavra); printf("%s\n", palavra); p = inverter2(palavra); printf("%s\n", p); return 0; }