Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renato Utsch

[Resolvido] Alternativa a gets() em C++

Recommended Posts

Olá!

 

No exemplo abaixo, eu estava procurando uma alternativa a gets() para fazer uma verificação de limites e desconsiderar os caracteres extras que forem passados para a string.

 

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
   char option[2];

   cout << "Digite (max 1 caractere): ";
   gets(option);

   cout << option;

   return 0;
}

 

Eu gostaria de, no programa acima, não substituir nada na memória com esse limite... Qual função eu uso?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da manpage de gets:

 

BUGS

Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of

the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.

 

A recomendação é fgets

 

mais aqui:

http://www.linhadecodigo.com.br/Dica.aspx?id=1141

Compartilhar este post


Link para o post
Compartilhar em outros sites

É exatamente oq ia falar kkk, veja sobre o fgets();

Eu particularmente nunca uso o gets();

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tá usando C++,o ideal é usar funções e bibliotecas do mesmo né.

Uma solução simples é um cin.get seguido de um cin.ignore.

#include <iostream>
#include <limits>
using namespace std;

int main()
{
   const unsigned n = numeric_limits<streamsize>::max();
   char c = cin.get();
   cin.ignore(n, '\n');
   cout << "c:" << c << endl;

   string trash;
   cin >> trash;
   cout << "Trash:" << trash << endl;
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas caso eu colocar xxxx e o limite é 2 caracteres, o cin.get() já não armazena os 4 passando do limite da matriz? Aí o cin.ignore excluiria esses 2 valores a mais?

 

Abraços :D

 

 

@edit:

 

Eu preferiria usar funções da biblioteca da C++, ao invés da C. No momento, não preciso de um console input que insere espaços, visto que só usarei uma letra para usar no menu.

 

Mas se não tiver jeito, uso da C mesmo...

 

 

Outra coisa, como funciona aquele "n" que você usou lá no cin.ignore() lá b2code?

 

E dei uma olhada no fget(), só achei com relação a arquivos, como posso usar no input do console?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Misturando uns códigos na net consegui algo assim:

 

#include <iostream>
#include <limits>

using namespace std;

int main () {
 char name[256], title[256];
 cout << "Enter your name: ";
 cin.getline (name,5);
 cin.clear();
 cin.ignore( numeric_limits <streamsize> ::max(), '\n' );
 cout << "Enter your favourite movie: ";
 cin.getline (title,10);
 cout << name << "'s favourite movie is " << title;
 return 0;
}

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não,o cin.get e getline (que tem por única diferença um delimitador já definido) vão colocar no ponteiro passado só o número de caracteres passado pra função,o lixo (o que vem antes do newline e depois dos n caracteres especificados ou delimitador) vai pro buffer do cin.O cin.ignore simplesmente vai limpar n caracteres desse buffer ou limpar até encontrar o delimitador (no caso,o newline).

#include <iostream>
using namespace std;

int main()
{
   char n[3];
   cin.get(n, 3, 0x00);
   cout << "n:" << n << endl;
   string trash;
   cin >> trash;
   cout << "Trash:" << trash << endl;
   return 0;
}

No linux,se você rodar o programa com:

echo "abTRASH" | ./nomePrograma

Você já vai receber de cara:

n:ab
Trash:TRASH

Com o ignore você vai receber um pedido de input já que o buffer do cin foi limpo.

Com o fgets você usaria na stdin,que é uma stream também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri que o fgets() usava o cabeçalho <stdio.h> em C :P

 

Então, tem uma versão dele na biblioteca da C++, no cabeçalho <cstdio> - funcionou igual eu tava querendo...

 

 

Muito obrigado aê pelo apoio gente, o fgets() é perfeito... Caso resolvido...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.