Pegando entrada do teclado e guardando em uma string
Publicado por leonardo (última atualização em 26/01/2011)
[ Hits: 11.092 ]
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
}
Bom treino, muito completo: classificação de atletas
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)
Como programar um sistema de controle para distribuições linux em c? (3)









