Ajuda função em C

rekateka

Membro
Alguém me pode explicar o que faz esta função por favor ?

A função é:

Código:
void limpa_ecran() {
int i;
for (i=0;i<30;i++)
putchar('\n');
}

Percebo que a função limpa o ecrã, mas não percebo o que o ciclo for e o putchar ('\n') faz aí. Alguém me pode ajudar ? Tenho tado a estudar um programa e a percebê-lo e tinha lá isso. Agradeço se me puderem ajudar.

Cumprimentos !
 
Última edição pelo moderador:
O ciclo faz com que o conjunto de instruções que estão lá dentro seja executado 30 vezes.

O putchar põe um caracter no ecrã.

O '\n' é uma quebra de linha (uma linha nova entenda-se).

Portanto, falando não tecnicamente, vais por 30 linhas vazias no ecran, dando a ilusão de que este foi limpo.
 
Olá
o \n tem o significado de nova linha.
como está num ciclo de 0 até 30 vais imprimir 30 novas linhas.
como uma nova linha não imprime nada no ecra, vais imprimir 30 nadas no ecra.

No codigo abaixo estou a imprimir o "linha", seguido do indice do ciclo, talvez te ajude a perceber.

Código:
void limpa_ecran() {
int i;
for (i=0;i<30;i++){
putchar('\n');
printf("linha %d",i);
}
}

Cumps.
 
Última edição pelo moderador:
Boa tarde pessoal ! Alguém me pode explicar mais ou menos como funciona este código ? Basicamente o programa tem uma base de dados, e ao abrir o programa para consultar uma lista de peças de motas, ele vai ler o ficheiro. Portanto ele corre um ciclo que lê a lista de peças existentes no programa a partir da peça 0 certo ?

O que não percebo muito bem é mais esta parte:
Código:
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%s",p->tipo);
buf=buf2+1;

____________________________________________________________________________

Código:
le_linha_ficheiro(f,buffer);/*le todas as linhas do ficheiro referentes a lista de pecas*/
sscanf(buffer,"%d;\n",&npecas);
for (i=0;i<npecas;i++) {/*corre lista de pecas a partir da posicao 0*/
p = nova_peca(0);
 
le_linha_ficheiro(f,buffer);
 
buf=buffer;/*Buffer é uma pequena área de memória usada para escrita e leitura de dados, 
e faz uma leitura rápida*/
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%d",&(p->id));/*sscanf é análoga a printf,
lê da string str e interpreta ela de acordo com o formato especificado.*/
buf=buf2+1;
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%s",p->tipo);
buf=buf2+1;
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%s",p->desig);
buf=buf2+1;
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%f",&(p->preco));
buf=buf2+1;
buf2= strstr(buf,";");
*buf2='\0';
sscanf(buf,"%s",p->marca);
 
 
mostra_peca(p);
 
Última edição pelo moderador:
Esse codigo procura na string buf por ";" e depois coloca la o '\0' que é o caracter terminador. Parece-me que serve apenas para nao ler o ';' da string buf como fazendo parte do texto.

tipo se tiveres "abcd;" server para leres de buf apenas "abcd".

buf=buf2+1 serve para avancares uma posicao na string e saltares o \0 que acabaste de por.
 
Exacto, a funçao strstr(const char *s1,const char* s2), devolve um apontador para a posiçao em que encontra a palavra contina em s2 na string s1, devolve NULL caso não encontre nada.
em *buf2='\0'; ele vai ao caracter apontado pelo endereço obtido na funçao anterior e iguala-o a '\0', que serve para terminar a string.
Seria o mesmo que fazer:

strncpy (buf2,"\0",1);
 
Obrigado, já percebi o programa todo, so me faz confusão esta função pois não conheco muito bem. Sei que retorna um valor diferente de 0 se o caracter inserido foi um caracter de espaçamento segundo a definição de isspace.

while (isspace(opcao = le_char())) {}


Este código estava metido antes do switch seguido dos cases.. Basicamente o que é que faz ? :s
 
A operação
Código:
opcao = le_char()
lê um caracter que é guardado na variável opcao. Depois é invocada a função isspace que tem como argumento a variável opcao, isto é, o valor que ela contém. Em função desse valor ser um <ESPAÇO> ou não, a função isspace devolve False (0) ou True (!=0). O ciclo while tem como parâmetro esse valor que funciona como um booleano. Basicamente, enquanto o caracter lido for um espaço, faz qualquer coisa.
 
Back
Topo