Pegando entrada do teclado e guardando em uma string
Publicado por leonardo (última atualização em 26/01/2011)
[ Hits: 11.049 ]
Homepage: http://www.sopadebytes.vai.la
Comentários no 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
}
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Perfil criado no samba ad dc não loga no Windows 10 e 11 (11)
Fedora - Google Workspace + SSSD (0)
Estou tentando ser legalista, mas tá complicado! (5)









