2009-07-17 6 views
0

J'ai un cours de livre qui prend le titre, l'auteur, le copyright, le numéro d'ISBN, et la caisse pour un objet de livre. Cependant, j'obtiens une erreur d'exécution lorsque le programme s'exécute. Après que l'utilisateur a entré le titre et appuyé sur Entrée, le programme bascule vers le bas, montrant le reste des sorties, puis termine le programme en donnant une erreur d'exécution.Erreur d'exécution, problème d'entrée possible?

J'ai essayé d'attraper une exception, mais je n'ai rien obtenu.

code:

#include "std_lib_facilities.h" 

class Book{ 
public: 
     string what_title(); 
     string what_author(); 
     int what_copyright(); 
     void store_ISBN(); 
     void is_checkout(); 
private: 
     char check; 
     int ISBNfirst, ISBNsecond, ISBNthird; 
     char ISBNlast; 
     string title; 
     string author; 
     int copyright; 
}; 

string Book::what_title() 
{ 
     cout << "Title: "; 
     cin >> title; 
     cout << endl; 
     return title; 
} 

string Book::what_author() 
{ 
     cout << "Author: "; 
     cin >> author; 
     cout << endl; 
     return author; 
} 

int Book::what_copyright() 
{ 
    cout << "Copyright Year: "; 
    cin >> copyright; 
    cout << endl; 
    return copyright; 
} 

void Book::store_ISBN() 
{ 
    bool test = false; 
    cout << "Enter ISBN number separated by spaces: "; 
    while(!test){ 
    cin >> ISBNfirst >> ISBNsecond >> ISBNthird >> ISBNlast; 
    if((ISBNfirst || ISBNsecond || ISBNthird)<0 || (ISBNfirst || ISBNsecond || ISBNthird)>9) 
        error("Invalid entry."); 
    else if(!isdigit(ISBNlast) || !isalpha(ISBNlast)) 
      error("Invalid entry."); 
    else test = true;}  
} 

void Book::is_checkout() 
{ 
    bool test = false; 
    cout << "Checked out?(Y or N): "; 
    while(!test){ 
    cin >> check; 
    if(check = 'Y') test = true; 
    else if(check = 'N') test = true;         
    else error("Invalid value.");} 
} 

int main() 
{ 
    Book one; 
    one.what_title(); 
    one.what_author(); 
    one.what_copyright(); 
    one.store_ISBN(); 
    one.is_checkout(); 
    keep_window_open(); 
} 

Je ne sais pas ce que le problème pourrait être. Toute aide est appréciée, merci.

Exemple de sortie:

Titre: Vol au-dessus d'un nid de coucou (lignes suivantes ne sont pas réellement espacées entre les deux et toutes les sorties à la fois) Auteur:

Droit d'auteur Année:

Entrer le numéro ISBN séparé par des espaces:

Cette application a demandé au Runtime de le terminer de manière inhabituelle. Veuillez contacter le support pour plus d'informations.

Ne vous inquiétez pas non plus des fonctions keep_window_open et error. Ils font partie de std_lib_facilities.h et ne sont probablement pas à l'origine du problème. L'erreur génère simplement un message d'erreur si un problème est rencontré.

+1

qu'est-ce que keep_window_open? –

+0

Que diriez-vous de montrer tout le code nécessaire (comme Alex le suggère, keep_window_open), et aussi montrer l'entrée/sortie de votre programme afin que nous puissions voir exactement ce qui est imprimé et où il échoue. – Tom

+0

Je viens de faire un rapide google de std_lib_facilities.h et c'est pour un cours ... il a une fonction keep_window_open: http://www.stroustrup.com/Programming/std_lib_facilities.h – Tom

Répondre

2

Le problème ici est que les flux d'entrée C++ ne suppriment pas les entrées malformatées qu'ils rencontrent. En d'autres termes, si vous essayez de lire un nombre et que le flux contient, par exemple, le caractère 'x' (pas un nombre), ce caractère n'est pas supprimé du flux d'entrée. De plus, si je me souviens bien, cela mettra également le flux d'entrée dans un état d'erreur provoquant l'échec d'une entrée correctement formatée. Bien qu'il existe un mécanisme pour tester l'état du flux d'entrée et supprimer l'entrée malformattted et effacer les drapeaux d'erreur, j'ai personnellement trouvé plus simple de toujours lire dans une chaîne (en utilisant ">>" ou "getline") puis d'analyser la chaîne Dans le cas d'un nombre, par exemple, vous pouvez utiliser les fonctions "strtol" ou "strtoul".

+0

Ouais j'étais assis ici en pensant et j'ai réalisé qu'il ne prenait que le "The" de la chaîne et en utilisant les autres entrées pour les prochaines fonctions. Je vais essayer votre suggestion. – trikker

+0

Yup getline a travaillé! Juste besoin d'une poussée dans la bonne direction, merci. – trikker

Questions connexes