aula 205

Dúvida | Como fazer uma função para inverter uma string em C?

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

Deixe um comentário

um + 15 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.