2009-12-06 5 views
0

Je dois surcharger l'opérateur d'extraction de flux. Je dois faire cela en permettant à un utilisateur d'entrer une chaîne de caractères à une invite, dites "iamastring", puis l'opérateur extraira chaque caractère de la chaîne et testera si c'est un espace et s'il ne s'agit pas d'un espace dans un tableau de caractères qui est ensuite passé à un objet.C++ Surcharge de l'opérateur >>

@Chip et al. Par exemple, je ne m'attends pas à ce qu'il sorte quelque chose à l'écran. Au lieu de cela, après qu'un utilisateur ait tapé une chaîne et que des accès soient entrés, l'utilisateur devrait être à nouveau invité à entrer une nouvelle sélection de menu. Au moment où il se trouve, l'utilisateur entre une entrée de chaîne, puis une "erreur de lecture incorrecte" s'affiche et l'invite revient en attente d'une nouvelle entrée.

+0

Étiez-vous programmeur C dans une vie antérieure? – Paul

+0

opérateur >> est l'opérateur EXTRACTION du flux –

+0

Votre tampon fuit. Vous devriez utiliser 'std :: vector' à la place. Cela dit, il suffit d'utiliser 'getline' et' string', comme l'a suggéré Neil. Votre vie sera beaucoup plus facile. – GManNickG

Répondre

3

Il est assez drôle - votre nom est comme le mien, mais en sens inverse :)

Que diriez-vous:

char buffer[buffSize+1]; // no need for dynamic allocation here 
unsigned i = 0; 
while(std::cin && !std::isspace(std::cin.peek()) && i < buffSize) 
    buffer[i++] = std::cin.get(); 
buffer[i] = '\0'; // null termination can be important. 
// i now contains the length btw 

Il est exactement votre propre code, un peu remaniée avec - je l'ai enlevé tous les trucs unneccesary etc, rien de plus ..

Edit: maintenant fixé pour vérifier l'état des cours d'eau & éviter tout débordement de la pile :)

Edit II: Changé std :: cin.good() & &! std :: cin.eof() à std :: cin. Btw: why does cin have a conversion to void* and not to a bool?

+0

Ce code est également cassé - voir ma réponse ci-dessus. –

+0

fixé! :) Merci. – rmn

+0

C'était utile et propre. Je me suis retrouvé avec une variation sur ce code. – ihtkwot

3

Y a-t-il une raison pour laquelle vous n'utilisez pas std :: string et std :: getline? Vous devriez réfléchir deux fois ou même trois fois avant d'écrire votre propre opérateur d'extraction - l'entrée formatée n'est pas une fonctionnalité particulièrement utile de C++ (ou de C, venez à ça).

+2

Je suis toujours douteux de tout cours de formation t vous empêche d'utiliser l'approche la plus simple du problème. J'écris du code C++ depuis plus de 20 ans, et je peux compter sur le nombre de fois où j'ai implémenté un opérateur d'extraction de flux. –

+0

Oui bien nous devons tous payer le piper. Je suppose que certains appelleraient l'exercice un peu sur le côté pédant mais il y a toujours quelque chose à apprendre en se cognant la tête à plusieurs reprises encore et encore sur votre clavier ... Je pense. – ihtkwot

1

Dans tous les cas, le code est cassé. Il ne gère pas les échecs de saisie, ce qui peut être fatal puisque votre code peut entrer dans une boucle infinie. Si vous encapsulez des opérations de lecture de flux, vous devez prendre soin de tester si le flux est dans un état valide.

+0

alors je voudrais tester ce ios :: goodbit == vrai, puis entrer dans ma boucle? – ihtkwot

+0

Ce n'est pas ainsi que fonctionnent les bits de flux. 'ios :: goodbit' est simplement une constante. De plus, '== true' est simplement redondant. Voir la réponse mise à jour @ rmn pour une façon correcte (quoique non-anonyle) d'accomplir ceci. –