Jump to content

[Dúvida] - Exercicio Proposto


Localhost
 Share

Recommended Posts

Olá pessoal, estava mais uma vez no meu estudo de C quando me deparo com o seguinte problema:

-Peça ao usuário para digitar uma string, guarde essa string numa variável, depois apresente a string ao contrário, ou seja por exemplo: ola fica alo, percebem? Também pedia para passar o conteúdo da primeira variável para outra e apresentar a string ao contrario com essa variável.

A ultima parte metesse um strcpy(variável_origem,variável_destino) e já está não é? Só não sei a parte de virar a string ao contrário  :bored:

Alguém podia ajudar? Por Favor  😁

here since 2009

Link to comment
Share on other sites

Uma string em C é um array de char terminado com null.

A solução é:

-Criar um array de chars da mesma dimensão q o input do utilizador.

-Saber a posição inicial do array de origem, q é o char* e a posição final, q é '\0' - 1.

-Depois é percorrer desde a posição final até á inicial copiando caracter a caracter, tirando partido da aritmética de ponteiros.

Se houver algum termo q n conheces, pesquisa pelo google. char*, '\0', array e aritmética de ponteiros são noções importantes para quem trabalha com C.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Eu fiz isto:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

    int x;

    char str[100],str1[100]; //Declaração das strings

    printf("Digite uma string: ");

    scanf("%s" ,&str);

    for(x=0;x<100;x++)  //Inicio da contagem de caracteres da string str

    {

        if (str[x] == '\0') //Se o contador encontrar o caracter '\0'

        {

          for(x='\0';x>0;x--) //O contador começa do final para o inicio

            {

            strcpy(str1,str); //Copia para str1

            printf("%s\n" ,str1[x]);  //Apresenta str1

            break;

            }

        }

    }

    system("pause");

}

here since 2009

Link to comment
Share on other sites

Bruno1234, obrigado pela ajuda, já consegui alguma coisa com isto:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

    int x,y,z;

    char str[100],str1[100]; //Declaração das strings

    printf("Digite uma string: ");

    scanf("%s" ,&str);

    for(x=0;x<100;x++)  //Inicio da contagem de caracteres da string str

    {

        if (x == '\0') //Se o contador encontrar o caracter '\0'

            {

            for(z=5;z>0;z--)

              {

              for(y=0;y<5;y++)

                {

                str1[0] = str[z]; //Copia para str1

                printf("%s\n" ,str1);  //Apresenta str1

                break;

                }

              }

            }

    }

    system("pause");

}

Agora o problema é como vou saber qual o numero de letras que devo usar, acho que vou ter de contar quando o usuário digitar, guardar numa variável int e utilizá-la mais tarde  😄

here since 2009

Link to comment
Share on other sites

Problema Resolvido, graças a ti [glow=red,2,300]bruno1234[/glow], obrigado!

Solução:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

    int x,y,z,cont;

    char str[100],str1[100]; //Declaração das strings

    printf("Digite uma string: ");

    scanf("%s" ,&str);

    cont=0;

    while(!str[cont]=='\0')

    {

      cont++;

      }

    for(x=0;x<100;x++)  //Inicio da contagem de caracteres da string str

    {

        if (x == '\0') //Se o contador encontrar o caracter '\0'

            {

            for(z=cont;z>0;z--)

              {

              for(y=0;y<cont;y++)

                {

                str1[0] = str[z]; //Copia para str1

                printf("%s\n" ,str1);  //Apresenta str1

                break;

                }

              }

            }

    }

    system("pause");

}

here since 2009

Link to comment
Share on other sites

Eu não percebo mto de C, mas já agora deixo-te aqui uma solução tb:

char str[100];
char novoStr[100];
int cont = 0;
int i = 0;

printf("Digite uma string: ");
    scanf("%s" ,&str);

while(str[cont]) ++cont;
for(i = 0; i <= cont; ++i)
{
	novoStr[i] = str[cont - i - 1];
	if (i == cont) novoStr[i] = '\0';
}

printf("%d %s -> %s\n", cont, &str, &novoStr);

O pessoal q domina C provavelmente fazia isto em meia linha de código.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Para inverter uma string basta percorrê-la até meio e ir trocando os caracteres 2 a 2 das posições simétricas.

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[1024], aux;
    int i, len;
    fgets(str,sizeof(str),stdin);
    len = strlen(str);
    for (i=0;i<len/2;i++) {
        aux=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=aux;
    }
    printf("%s\n",str);
    return 0;
}
Link to comment
Share on other sites

Baderous, isso já é um bocado avançado mas obrigado, eu um dia hei-de chegar a esse nível, afinal ainda tenho 15 anos, ainda tenho muito tempo para aprender  🙂

Nunca é cedo para aprender (e tentar perceber). Aquilo que precisas para perceber o que o Baderous fez não é experiência, é lógica, acredita que se tentares só ganhas com isso.

Alguem me podia explicar esta linha de código:

novoStr = str[cont - i - 1];

Está dentro de um ciclo for, que incrementa a variável i em cada passo. Basicamente o que faz é ir colocando na posição i da nova string, o caracter que está na posição cont - i - 1 (na i-ésima posição a contar do fim) da string que recebeste.

Por exemplo, se tens uma string com 10 caracteres, começa por fazer, com i=0, novoStr[0] = str[9]; (9 é a posição do último caracter numa string com 10 caracteres).

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Baderous, isso já é um bocado avançado mas obrigado, eu um dia hei-de chegar a esse nível, afinal ainda tenho 15 anos, ainda tenho muito tempo para aprender 

Nunca é cedo para aprender (e tentar perceber). Aquilo que precisas para perceber o que o Baderous fez não é experiência, é lógica, acredita que se tentares só ganhas com isso.

Calma, não percebeste o meu ponto de vista. O que eu queria dizer é que ainda sou iniciado em C portanto é obvio que ainda não tenho os conhecimento daqueles conceitos todos, era só isso que estava a tentar dizer.

Quanto à linha de código a única coisa que não percebo é aquela subtracção: cont - i - 1 e continuo sem perceber o que faz  ?

Podias explicar exclusivamente essa parte?

👍

here since 2009

Link to comment
Share on other sites

Calma, não percebeste o meu ponto de vista. O que eu queria dizer é que ainda sou iniciado em C portanto é obvio que ainda não tenho os conhecimento daqueles conceitos todos, era só isso que estava a tentar dizer.

Eu percebi muito bem o que estavas a dizer, e tentei explicar-te que a solução do bruno1234 que tu pensas que é simples, usa tantos conceitos de C como a do Baderous.

Quanto à linha de código a única coisa que não percebo é aquela subtracção: cont - i - 1 e continuo sem perceber o que faz  ?

Podias explicar exclusivamente essa parte?

👍

cont é o comprimento da tua string.

Para obter a posição do último elemento da string tens que fazer cont - 1 (porque uma string com 'n' caracteres ocupa as posições 0 até n-1).

Para ir "recuando" na string tens que subtrair i. Como tens um ciclo com i desde 0 até cont, vais andando deste a última posição até à primeira.

Explicar melhor só se fizer uma tabelinha.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.