2016-01-18 3 views
0

Le problème est que la taille des chaînes est faible. Les bits débordants sont donc affectés à la chaîne suivante.Empêcher le dépassement de tampon lors de l'utilisation de cin.getline et de fgets en conjugaison

Je suis récemment venu de savoir que nous ne devrions pas utiliser fflush (stdin) pour rejeter la séquence indésirable dans le flux d'entrée lors de l'utilisation getline comme il a un comportement non défini. Les gens recommandent d'utiliser cin.ignore() à la place.

Mais que devons-nous utiliser pour ignorer la séquence non désirée dans le flux d'entrée avec fgets?

#include <iostream> 
#include <string> 
#include <cstdio> 

using namespace std; 

int main() { 
    string cpp; 
    char c1[6]; 
    char c2[5]; 

    // Reading C++ string: GETLINE 
    getline(cin, cpp); 

    // Reading C string: CIN.GETLINE 
    cin.getline(c1, sizeof(c1)); 

    // cin.ignore(); DOESNT WORK 
    // fflush(stdin); UNDEFINED BEHAVIOR 


    // Reading C string: FGETS 
    fgets(c2, sizeof(c2), stdin); 

    cout << " " << cpp << '\n' << c1 << '\n' << c2 << '\n'; 

    return 0; 
} 

enter image description here

+0

Pourriez-vous donner un exemple d'entrée, la sortie observée et la sortie désirée. – user2079303

+0

@ user2079303 Terminé. En fait, la sortie désirée est capable d'entrer la chaîne ** c2 **. Actuellement, les caractères survolés sont stockés dans c2. –

Répondre

1

Vous pouvez utiliser l'ancienne c way sauter le reste de la ligne en utilisant getchar.

char c; 
while((c = std::getchar()) != '\n' && c != EOF);