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;
}
