2016-03-18 2 views
0

Je suis en train de surcharger le >> opérateur de lire un seul (créé avec enum Symbol {e,a,b,c,d};) Symbole:En utilisant strchr surcharger >>

istream & operator >> (istream & is, Symbol & sym) { 
    Symbol Arr[]={e,a,b,c,d}; 
    char ch; 
    is>>ch; 
    if (strchr("eabcd",ch)) 
    sym=Arr[ch-'e']; 
     else { 
     is.unget(); 
     is.setstate(ios::failbit); 
     } 
    return is; 
} 

Mais ce lit des déchets (chiffres) au lieu de ce que je la recherche, conduisant à une erreur de segmentation en essayant de l'imprimer avec ma surcharge < <, qu'est-ce que je fais mal? Edit: Oh, et bien sûr j'ai ajouté using namespace std; au début, même avec iostream et cstring compris.

+0

Juste curieux, quel problème voulez-vous résoudre? – Incomputable

+0

Cela fait partie d'un plus grand projet pour mon cours de programmation d'objet dans une université, j'ai besoin de lire des symboles pour ensuite faire des opérations avec une table supplémentaire. –

Répondre

1

Il y a quelques erreurs ici. D'abord, réparons votre contreventement. Utilisez toujours des accolades. Il est très difficile de voir ce qui est aligné avec ce qui suit:

istream & operator >> (istream & is, Symbol & sym) { 
    Symbol Arr[]={e,a,b,c,d}; 
    char ch; 
    is>>ch; 
    if (strchr("eabcd",ch)) { 
     sym=Arr[ch-'e']; 
    } 
    else { 
     is.unget(); 
     is.setstate(ios::failbit); 
    } 
    return is; 
} 

Très bien. Maintenant, que se passe-t-il si l'utilisateur entre quelque chose comme 'a'. Le strchr réussit, puis vous effectuez . Mais ch - 'e' dans ce cas est -4. Quelque part de mémoire totalement aléatoire quelque part, donc vous obtenez des ordures. Pour utiliser effectivement strchr, vous aurez besoin de faire quelque chose comme:

const char* options = "eabcd"; 
if (const char* p = strchr(options, ch)) { 
    sym = Arr[p - options]; 
} 

Mais c'est un peu terrible. Je suggère simplement utiliser un interrupteur:

switch (ch) { 
    case 'e': sym = e; break; 
    case 'a': sym = a; break; 
    ... 
    default: 
     is.unget(); 
     is.setstate(ios::failbit); 
} 

également, is >> ch pourrait échouer et vous n'êtes pas vérifier que. Vous devriez:

istream& operator>>(istream& is, Symbol& sym) { 
    char ch; 
    if (is >> ch) { 
     switch(ch) { ... } 
    } 
    return is; 
} 
+0

Mais pourquoi est-ce '-4' et pas 1? 'a' vient après' e' dans mon code, est-ce que je ne comprends pas comment 'strchr' fonctionne? –

+0

@GizmoofArabia Vous soustrayez 'char's. Votre énumération n'est pas pertinente. – Barry

+0

@GIzmoofArabia, Non. Lorsque vous effectuez une sous-construction, 'a' - 'e' est négatif, car vous effectuez une sous-construction de code ASCII. Jetez un oeil à [codes ASCII] (http://www.asciitable.com/). Regardez les colonnes dec et char. – Incomputable

0

Si ch est 'a', ch - 'e' (97-101) sera un nombre négatif (-4), ce qui conduira à accéder au tableau Arr hors limites. Cela conduit à un comportement indéfini.

La façon dont vous avez vos symboles, vous devrez utiliser une déclaration switch:

switch (ch) 
{ 
    case 'a': 
     sym = a; 
     break; 

    case 'b': 
     sym = b; 
     break; 

    case 'c': 
     sym = c; 
     break; 

    case 'd': 
     sym = d; 
     break; 

    case 'e': 
     sym = e; 
     break; 

    default: 
    // Nothing to do 
    break; 
} 

Si vous souhaitez utiliser Arr, vous devrez définir Arr comme:

Symbol Arr[]={a,b,c,d,e}; 

Ensuite, vous pouvez accéder au tableau comme ci-dessous et éviter l'instruction switch:

sym=Arr[ch-'a']; // ch - 'a' is 0 when ch is 'a' 
        // ch - 'a' is 4 when ch is 'e'. 
+0

''' - ch' ne fonctionnera pas parce que les éléments de' Arr' ne sont pas dans l'ordre séquentiel de 'e' à' a'. –

+0

@RemyLebeau, merci d'avoir signalé l'erreur. C'est corrigé maintenant. –