• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Localhost

[Dúvida] - Exercicio Proposto

22 mensagens neste tópico

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  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela resposta, conheço todos os conceitos excepto aritmética de ponteiros (estou a iniciar agora o estudo a ponteiros), mas não existe outra maneira mais simples de se fazer? É que ainda não cheguei a um nível de conhecimento tão alto :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia era essa.

A única diferença é q n precisavas de fixar pelo menos o 2º array com as 100 posições.

Mas assim tb pode ser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas não deu, eu digitava uma string e não aparecia :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não devias usar o strcpy, mas sim copiar posição a posição do array.

str1[inicial] = str[final]

e depois incrementar a inicial e decrementar a final.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para saberes a dimensão da string q o utilizador inseriu é procurares no array de input por '\0'.

Faz um while até encontrares o '\0' nesse array, incrementando um inteiro q depois te dá a dimensão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim essa parte eu sei, obrigado, mais logo venho aqui dar os resultados  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já nem me lembrava da existência do strlen, isso poupa o while q fiz para saber a dimensão da string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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  :)

Alguem me podia explicar esta linha de código:

novoStr = str[cont - i - 1];

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

:thumbsup:

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já percebi, desculpa lá o incomodo, estás em eng. informática? Gostava de ter algumas infos. sobre o curso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já percebi, desculpa lá o incomodo, estás em eng. informática? Gostava de ter algumas infos. sobre o curso...

Não, mas estou em Engenharia Biomédica, se quiseres infos posso dar com todo o gosto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora