Pegando entrada do teclado e guardando em uma string

Publicado por leonardo (última atualização em 26/01/2011)

[ Hits: 10.780 ]

Homepage: http://www.sopadebytes.vai.la

Download 4873.main.c




Comentários no código fonte...

  



Esconder código-fonte

#include <stdio.h>
#include <stdlib.h>
/*
Normalmente para ler um texto do teclado voce faria assim:
#include <stdio.h>
int main(int argc, char *argv[])
{
  char txt[8000];
  printf ("Entre com o seu nome: ?\n==> ");
  gets (txt);
  //scanf ("%s", txt);
  printf ("O nome e: %s\n", txt);  
  system("PAUSE");   
  return 0;
}
Mas isso desperdiçaria memoria e poderia acontecer do nome do cara
ter mais de 8000 :P caracteres;
Ou faria assim:
#include <stdio.h>
int main(int argc, char *argv[])
{
  unsigned char *txt;
  unsigned int num;
  printf("quantas letras tem seu nome ?\n==> ");
  scanf("%d", &num);
  txt = (char * ) malloc(sizeof(char)*num);
  printf("entre com seu nome:\n==> ");
  scanf("%s", txt);
  printf("O nome e: %s\n", txt);  
  system("PAUSE");   
  return 0;
}
Mas isso não ficaria legal ...
ao inves disso, voce deve fazer o seguinte:   
*/
int main(int argc, char *argv[])
{
  unsigned char *txt; //declara o ponteiro que vai receber o texto
  unsigned int num = 0; //declara um contador
  txt = (char * ) malloc(sizeof(char)*1); //começa alocando o primeiro espaço na memoria
  printf ("Entre com o nome:\n==> "); //pergunta o nome
  while (*(txt+num-1) != 13){ //Enquanto o usuario não apertar enter
        *(txt+num) = getch(); //O comando getchar não serve, ao
        //inves disso, o getch retorna o caractere apertado, mas não
        //improme na tela
        putchar(*(txt+num)); //agora imprime o caractere na tela
        if ( *(txt+num) == 8){ //Verifica se eu apertei backspace
            if (num != 0){ //se eu apertei backspace e o cursor estiver em uma
            //posição diferente de zero
                putchar(' '); //Apaga o caractere daquele espaço
                putchar(8); // e volta pra la
                num = num -2; //subtrai 2, ja que vai ser adicionado 1 mais adiante
            }else{ //se o cursor estiver na posição zero
                putchar(' '); // vai pra frente mais uma vez
                num --; //e umpede o contador de ser incrementado
            }
        }
        num++; //aumenta 1 ao contador
        txt = realloc(txt,sizeof(char)*num+1); // e aloca memoria para receber mais um caractere
    }
  *(txt+num-1)=NULL; // agora ele coloca o terminador no ultimo valor do vetor
  printf ("\n");//vai para a proxima linha
  printf ("O nome e %s\n", txt); //e mostra o valor da variavel
  printf ("Aperte qualquer tecla para continuar ..."); //system("PAUSE") :x
  free(txt); //liberta a memoria utilizada
  getch(); //continuação de system("PAUSE");)    
  return 0;//termina
}

Scripts recomendados

Usando regex com linguagem C

Mini Analisador Léxico que conta palavras numa string

Arvore em C

Validação de emails em C/C++

Retirar caracteres de uma frase


  

Comentários
[1] Comentário enviado por f_Candido em 26/01/2011 - 21:36h

Olá,

Duas observações em seu código :
1º - a função "gets" é deprecated, ou seja, não recomendada devido ao estouro de buffer.
2º - a função "getch" é pertinente a lib conio que é privada, ou seja, não portável em Linux.

Abraços

[2] Comentário enviado por hudyfx em 12/09/2011 - 17:56h

ola... esse programa não esta rodando...

gcc -o arquivo arquivo.c
arquivo.c: In function ‘main’:
arquivo.c:61: warning: assignment makes integer from pointer without a cast
/tmp/ccI2Whr3.o: In function `main':
arquivo.c:(.text+0x40): undefined reference to `getch'
arquivo.c:(.text+0x127): undefined reference to `getch'
collect2: ld returned 1 exit status


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts