Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Destinado a quem tem dúvidas em strings

Mensagens Recomendadas

fo_11

Bem, sou novato e depois de tanto bater na mesma tecla lá consegui entender como funcionam as strings e como é que podemos trabalhar e queria partilhar com os outros novatos que pretendem aprender como as coisas funcionam entre strings.

Vou fazer uma explicação um pouco ao nível de quem está a explicar uma criança mas sem querer ofender ninguém (foi assim que percebi a lógica das strings)...

Antes de todo o que é uma string?

Resposta: É um array de caracteres mas tem algo de especial que a diferencia de um arrua de caracteres, podendo assim ser tratada como uma string. Essa marca especial é '\0' que se encontra no final do seu conteúdo.

E basicamente o que faz perguntam vocês?

Bem tem a função de indicar onde termina a string e todo o que estiver para lá do terminador ('\0') não interessa.

Exemplo: Imaginem esta palavra numa string João Gomes e querem por alguma razão eliminar o Gomes mas usando só esta string. O que se faz é meter no espaço entre João e Gomes o '\0' e o Gomes mesmo estando na memoria é ignorado. Se o João Gomes fosse um arrua e queriamos torna-lo numa string basta colocar no fim de todo, isto é,depois do caracter s o terminador de string ('\0').

Agora pensem desta forma:

Imaginem um autocarro mas só com uma fila de banco...(É um bocado estúpido mas dá para perceber a ideia de como manipular uma string ).

O numero de bancos disponíveis corresponde ao tamanho máximo da string.

O terminador de string é como se fosse um tutor da cresce, daqueles miúdos irrequietos que têm de estar sempre a ser supervisionados.

Logo ele fica sempre atrás do ultimo menino da fila de bancos (os meninos como podem ver são os caracteres) e como é obvio só podemos colocar n-1 meninos sendo n a lotação do autocarro pois temos de ter sempre espaço para o tutor. Mas se o autocarro não encher também não à problema depois do tutor não está lá nada.

Agora temos dois autocarros (estranhos) de uma só fila de bancos.

Um está cheio com respectivo tutor e o outro encontrasse vazio. O objectivo é preencher até um certo ponto o autocarro vazio.

O que se faz então?

Temos de arranjar um tutor e ele entre sempre primeiro no autocarro e depois vai trocando de lugar indo cada vez mais para Trás mas atenção que ele tem o limite dos numero de bancos. Quero colocar um caracter(miudo) no primerio banco a[0] logo antes de colocar lá o menino tenha de colocar primeiro o tutor dentro do autocarro, então antes de nada temos de colocar o terminador de string na posição a[1] e depois é que colocamos o mínimo na posição a[0] e é sempre assim.

Agora imaginem um ciclo for e querem copiar só parte de uma string para a outra como acontece no programa abaixo.

então fazem sempre inserir primeiro e tem de ser sempre ele o primeiro a ser introduzido para evitar problemas, o terminador, e fazemos assim a[i+1] e depois o respectivo caracter a[ i ]. E assim andamos sempre com um terminador à no final do conteúdo  evitando assim que ele desapareça, ao ser sobreescrito  por um caracter e assim a string nunca deixa de ser string evitando muitos problemas como aparecer lixo nessa string.

Agora para quem quer aprender a mexer em strings sem saber das funções existentes na biblioteca string.h aqui vai a este programa:

Se perceberem tem mais de metade da informação necessária para lidar com strings a outra metade advém de saber jogar com aquilo que se tem.

Para verem o que acontece se copiarmos primeiro o caracter e depois colocarmos o terminador troquem só a ordem das acções isto é primeiro a[ i ]=v[ i ] e depois a[i+1]='\0'

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

#define MAX 100
#define MAIOR(x,y) (((x)>(y))? (x):(y))

int main()
{
    char v[MAX],auxv[MAX];
    int i,maior=0,num,j=0,contador=0;
    printf("Inserir 6 numeros:");
    gets(v);
   ////Precisamos de colocar um espaço no final para se fazer a comparação do ultimo elemento senão termina o for e não à comparação 
    v[(strlen(v)+1)]='\0';//como foi explicado primeiro coloca-se o terminador de string
    v[(strlen(v))]=' ';//depois sobreescreve-se por cima do antigo terminador o espaço que era o que queriamos 
    
    for(i=0;v[i]!='\0';i++)
     {if(v[i]!=' ')
       {auxv[j+1]='\0';//mesmo caso primeiro transformar este array numa string logo coloco '\0' e coloco no auxv[j+1] pois no auxv[j] vai ser copiado o caracter
        auxv[j]=v[i];//já temos o terminador no final a delimitar a string e já temos condições para copiar o caracter
        ++j;
       }
        
      else
       {num=atoi(auxv);
        maior=MAIOR(maior,num); //verifica qual é o maior numero
        j=0;       }
     }
    
    printf("Maior numero:%d\n",maior);
    system("pause");
}

Espero ter ajudado  :P

Atenção aos [ i ] fora das tags code

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não li, talvez leia depois mas tens aí um erro grave.

Acho que já te disse várias vezes mas repito, não uses a função gets:P


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Isso não é bem um erro grave, é uma possível (sendo "possível" a palavra chave :P ) falha de segurança.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Sim, já me chamaram várias vezes atenção sobre a função gets...

Peço desculpa por continuar a usa-la mas como ainda estou num nível muito baixo de c os meus programas na maior parte das vezes dão muitos erros,  sendo alguns que não sei de onde vêm e por isso esqueço me de usar a fgets( ).

EDIT: Assim que puder modifico essa função até lá fica o aviso a todos os principiantes para substituirem a função gets pela fgerts quando quiserem usar o programa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Inseres numeros na linha de comandos e eles são recebidos como se fossem caracteres (imposto pelo professor) e temos de descobrir qual deles é o maior.

Exemplo:

12 22 555 22 1155 (um array de caracteres e não de inteiros ter atenção)

O maior numero é o 1155 como é óbvio.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Se não colocar acima o array fica com lixo, sinceramente ainda não percebi porque...

Experimenta correr o programa onde primeiro copias o caracter e depois colocas o terminador a ver o que te dá

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Acho que bastava fazer isto:

char str[1024];
int aux = 0;
int check = 0;
fgets(str,1023,stdin);
while(str[aux++] != '\0') {
  if(str[aux] != ' ') {
    check = atoi(str[aux]);
    // blah
  }
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Não sei se percebi muito bem esse exemplo mas se for o que estou a pensar assim não vai dar.

Imagina que se insere o numero:

1024 12

o que estás a fazer é a comparar individualmente cada numero,isto é, pegas n numero 1 do 1024 e comparas, pegas no 0 e comparas e não é isso que se quer mas sim pegar no numero como um todo e comparar.

Pegas no 1024 e comparas pegas no 12 e comparas.

Agora lembrei de outra forma de fazeres. Começas do fim da string e vais tirando os numeros para uma variavel de inteiros e fazes isto:

2 se não for espaço tiras outro numero vezes 10 se somas ao 2. é espaço sim então comparas esse numero.

Basicamente a logica é esta:

12=2+1*10

1024=4+2*10+0*100+1*100

E penso que seria mais facil assim

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tens razão, não me lembrei desse pormenor.

Mas mesmo assim era só acrescentar um while até encontrar um espaço.


here since 2009

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.