Marcelo L. Oliveira

Enquete

Você concorda com instituições como, por exemplo, a Petrobrás, que discriminam profissionais formados em cursos superiores tecnólogos?



Conexões:

del.ici.us

Linkedin

Plaxo
Twitter

Libertações:

Windows 7 Sins

Validações:

Este site é XHTML 1.0 Transitional válido
Este site é CSS válido


Introdução à Linguagem C - Tutorial II

PDF Versão para impressão Enviar por E-mail

Linguagem C

Uma tarefa simples em outras linguagens, mas em C, é bem confusa, é quando você tenta armazenar em uma variável, uma string que contenha espaços em branco.

Exemplo 1:
#include <stdio.h> 

int main()
{
char nome[20];

printf("Entre com seu nome\n");

// se você digitar seu nome completo, terá problemas
scanf("%s",nome);

// na variável "nome" será armazenada apenas a primeira
// palavra digitada.
printf("Seu nome é: %s \n",nome);
return(0);
}

No exemplo acima, o programa solicita um nome. Se você digita uma string composta, no caso, seu nome completo, a função scanf() irá desprezar todo o conteúdo a partir do espaço. Desta forma, na variável nome conterá apenas o primeiro nome digitado.

Uma outra alternativa poderia ser a função gets(). É, poderia... mas gets() não é uma boa alternativa.

Com a função gets() não há limites, o usuário poderá digitar mais caracteres do que o que foi definido no array, na declaração da variável.


Exemplo 2:
#include <stdio.h>

int main()
{
// nos [] você define o número máximo de caracteres
char nome[20];

printf("Entre com seu nome\n");

// se o usuário digitar mais que 20 caracteres, haverá um erro
gets(nome);

// na variável "nome", foi armazenado apenas a primeira palavra
printf("Seu nome é: %s \n",nome);
return(0);
}

A melhor forma então, utilizar a função fgets():

Exemplo 3:
#include <stdio.h>

int main()
{
char nome[20];

printf("Entre com seu nome\n");

// fgets() tem a mesma funcionalidade de gets()
fgets(nome,20,stdin);

// na variável "nome", foi armazenado a frase completa
printf("Seu nome é: %s \n",nome);
return(0);
}

Ainda haverá um problema, caso exista um scanf() antes do fgets():

Exemplo 4:

#include <stdio.h>

int main()
{
char nome[20];
int idade;

printf("Digite sua idade\n");
scanf("%d",&idade);

printf("\nEntre com seu nome\n");

// aqui não será solicitada uma entrada de dados
fgets(nome,20,stdin);

printf("Seu nome é: %s \n",nome);
return(0);
}

Neste exemplo, o fgets() nem solicitará uma entrada, isto porque, ele pega o '\n' do ENTER, que foi usado para inserir dados com o scanf(). É necessário então, limpar o buffer de entrada.

No próximo exemplo, a solução:


Exemplo 5:
#include <stdio.h>

int main()
{
char nome[20];
int idade;

printf("Digite sua idade\n");

// o scanf ler o conteúdo digitado, depois, o parâmetro *c,
// faz com que seja retirado os demais caracteres.
scanf("%d%*c",&idade);

printf("\nEntre com seu nome\n");

// agora, tudo perfeito
fgets(nome,20,stdin);

// "nome" armazenou apenas a frase digitada
printf("Seu nome é: %s \n",nome);
return(0);
}

Para aprender como compilar arquivos .c no Linux, leia a dica Compilando arquivos .c no Linux.  

The end!

 

Atualizado em Quinta, 22 Outubro 2009 16:50
 
Copyright © 2010 MarceloWeb. Todos os direitos reservados.
Joomla! é um Software Livre sob licença GNU/GPL.