Inversão de strings em C

1. Inversão de strings em C

Pamela Aliny Cleto Pavan
PamelaPavan

(usa Outra)

Enviado em 26/11/2018 - 15:57h

/*Preciso fazer uma função que recebe uma string como argumento e faz a sua inversão, mas essa função precisa ter como parâmetro um ponteiro. Protótipo da função: void inverteString(char *s).*/
///Meu código está errado, mas vou mandar o que eu fiz:

/*Importação de bibliotecas*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <strings.h>

void inverteString(char *s){

int i, g=0;
char inverso[50];

// Laço para inverter a string
for(i=strlen(*s)-1;i>=0;i--){
inverso[g] = *s[i];
++g;
}
inverso[g] = '\0';

printf("%s", inverso[g]);


}

/*Função Principal*/
int main(){
setlocale(LC_ALL, "Portuguese");
char string[50];

// Entrada de dados
printf("Informe um texto: ");
fflush(stdin);
gets(string);

// Chama função inverteString
inverteString(&string);



system("pause");
return 0;
}



  


2. Re: Inversão de strings em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/11/2018 - 18:49h

Pelo enunciado, o que eu entendo é que a função tem de inverter a própria string que lhe é passada através do parâmetro. Ou seja: se eu tenho “char str="Paulo";” e chamo inverteString(str), o valor de str deve ser alterado para “oluaP”.


3. Re: Inversão de strings em C

Pamela Aliny Cleto Pavan
PamelaPavan

(usa Outra)

Enviado em 26/11/2018 - 19:12h

paulo1205 escreveu:

Pelo enunciado, o que eu entendo é que a função tem de inverter a própria string que lhe é passada através do parâmetro. Ou seja: se eu tenho ?char str="Paulo";? e chamo inverteString(str), o valor de str deve ser alterado para ?oluaP?.


Sim, é isso, mas eu preciso usar ponteiro. Essa é a questão de uma lista de exercicios de ponteiros da faculdade, a qual diz:
"Faça uma função que recebe uma string como argumento e faz a sua inversão, ou seja, se a string “amor” for passada, ela será alterada para “roma”.
Protótipo da função: void inverteString(char *s)"

No entanto, n sei fazer isso usando ponteiros ;-;




4. Re: Inversão de strings em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/11/2018 - 09:37h

Sabe fazer com arrays (vetores)?

Aliás, antes disso: saberia fazer com um conjunto de cartões, se eles estivessem colocados na sua frente?

Se a sua cabeça funcionar mais ou menos como a minha, se eu tivesse de inverter a ordem de uma fileira de cartões de papel que estivessem alinhados na minha frente, eu começaria trocando, com minhas duas mãos, os cartões da extremidade esquerda e da extremidade da direita, e iria, sucessivamente, trocando os cartões das posições que se aproximassem do centro da fileira, até que minhas mãos se encontrassem (ou se cruzassem) no centro da fileira.

Um array, e particularmente um que represente uma string, é um análogo quase exato de uma fileira de cartões (só não é melhor porque você nem sempre sabe de antemão onde está a extremidade final da “fileira” contida na string). E, sendo esse análogo, você poderia pensar também em o que você poderia usar para representar os papéis de suas mãos, que começam nos extremos, e vão convergindo para o centro.

Para mim, poderiam ser dois índices: um que começa em zero e vai crescendo (movimento da esquerda para o centro), e outro que começa na posição final e vai diminuindo (movimento da direita para o centro).

Agora veja que interessante: se você tem um array e um índice, você tem uma forma de apontar para um elemento específico do array.

Opa! Eu disse “apontar”... Sabe o que mais serve para apontar? Pois é: aqueles famigerados e temidos ponteiros — que provavelmente não deveriam ser tão famigerados ou temidos assim.

Aliás, você sabia que, em C, um array só é tratado como array em três situações sintáticas específicas e que em todos os outros casos ele é tratado como se fosse ponteiro? Os três casos são o momento de sua declaração e quando o objeto declarado é passado como operando dos operadores unários & (obtenção de endereço) e sizeof (cálculo da quantidade de memória ocupada); em todos os demais casos, inclusive quando você usa a forma “array[indice]”, o array é tratado como ponteiro. Isso implica necessariamente que você pode fazer “ponteiro[indice]”, desde que o valor do ponteiro se refira ao elemento (provavelmente o primeiro elemento, que é o que tem índice zero) de um array.

Com essas dicas, você consegue fazer?


5. Re: Inversão de strings em C

Pamela Aliny Cleto Pavan
PamelaPavan

(usa Outra)

Enviado em 27/11/2018 - 09:46h

Uma colega me ajudou. Ficou assim:

/*CABEÇALHO
OBJETIVO: Faça uma função que recebe uma string como argumento e faz a sua inversão
*/

/*Declaração de bibliotecas*/
#include <stdio.h>
#include <conio.h>
#include <string.h>

/*Declaração de funções*/
void inverteString (char *s){

char *invertido=s,letra;

int i;

for(i=0;i<(strlen(s))/2;i++){
letra=*(s+i);
*(s+i)=*(s+strlen(s)-i-1);
*(s+strlen(s)-i-1)=letra;
}

}

/*Função Principal*/
int main(){
/*Declaração de variáveis*/
char abc[100];

printf("\nDigite uma palavra:");
fflush(stdin);
gets(abc);


inverteString(&abc);

puts(abc);


getch();
return 0;
}



6. Re: Inversão de strings em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/11/2018 - 04:05h

Permita-me fazer alguns comentários no seu código.

PamelaPavan escreveu:

Uma colega me ajudou. Ficou assim:

/*CABEÇALHO
OBJETIVO: Faça uma função que recebe uma string como argumento e faz a sua inversão
*/

/*Declaração de bibliotecas*/
#include <stdio.h>
#include <conio.h>
#include <string.h>

/*Declaração de funções*/
void inverteString (char *s){

char *invertido=s,letra;

int i;

for(i=0;i<(strlen(s))/2;i++){
letra=*(s+i);
*(s+i)=*(s+strlen(s)-i-1);
*(s+strlen(s)-i-1)=letra;
}


Cada vez que você chama a função strlen(), o programa varre a string toda de novo para calcular seu tamanho Isso dá três vezes por iteração. Como, no entanto, o tamanho da string não muda quando você inverte os elementos, você poderia calcular o tamanho uma vez só (fora do laço de repetição) e salvar o resultado numa variável, que você usaria no lugar das chamadas à função.

Contudo, nada disso é necessário. Veja uma versão usando notação de arrays.
void inverteString(char *str){
int i_esq=0, i_dir=strlen(str)-1;
while(i_esq<i_dir){
char temp=str[i_dir];
str[i_dir]=str[i_esq];
str[i_esq]=temp;
i_esq++; i_dir--;
}
}


E uma versão usando ponteiros.
void inverteString(char *str){
for(char *dir=str+strlen(str)-1; dir>str; dir--, str++){
char temp=*dir;
*dir=*str;
*str=temp;
}
}



}

/*Função Principal*/
int main(){
/*Declaração de variáveis*/
char abc[100];

printf("\nDigite uma palavra:");
fflush(stdin);
gets(abc);


A função gets() foi removida da biblioteca padrão do C por causa de um defeito de projeto. Use outras funções de leitura, de preferência que permitam informar o tamanho máximo de caracteres suportado pelo vetor que vai receber os dados lidos.



inverteString(&abc);


Você não deve usar o operador & nesse ponto. Como eu disse de passagem em minha mensagem anterior, o array é automaticamente convertido em ponteiro sem que você precise fazer nada, exceto quando você usa os operadores sizeof e &, que foi justamente o que você usou (esse operador também gera um ponteiro, para para outro tipo de dados, diferente do esperado pela função; se você habilitar opções de diagnóstico de código, vai ver o compilador alarmar sobre essa construção).


puts(abc);


getch();
return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts