2010-01-10 4 views
3

Je suis en train de lire un tampon en C++ un caractère à la fois jusqu'à '\ n', et initialiser tableau char avec ces caractères en utilisant do-while loop. Je sais que je pourrais utiliser cin.getline(), mais je veux l'essayer moi-même.lecture tampon C++

int main() 
{ 
    char buffer [1024]; 
    int index = 0; 
    char temp; 

    do 
    { 
     cin.get(temp); 
     buffer [ index ] = temp; 
     index ++; 
    } 
    while (temp != '\n'); 

    cout << buffer << endl; 

    return 0; 
} 

Il me donne les résultats de la jachère texte proprement dit incorrecte par deux lignes de supports squre mélangés avec d'autres symboles étranges.

+0

BTW, 'std :: getline()' est plus simple à utiliser que 'std :: istream :: getline()' puisque ce dernier nécessite de choisir une taille de buffer à l'avance . – jamesdlin

Répondre

5

Dans un premier temps, après tout le texte que vous avez à ajouter '\0' comme fin de la chaîne

il devrait ressembler buffer[ index ] = 0; parce que vous devez réécrire votre \n caractère que vous ajoutez aussi.

Bien sûr, il y a d'autres choses que vous devriez vérifier, mais ils ne sont pas votre problème principal

  • longueur de votre entrée parce que vous avez tampon limité - longueur maximale est 1023 + octet nul
  • fin l'entrée standard cin.eof()
+0

+1 J'y retournerais car il est plus explicite que ZT ait été fait (vous n'avez pas besoin de chercher que le buffer entier a été mis à 0) – epatel

3

Vous n'êtes pas null-délimitant votre tampon.

Essayez de changer la première ligne à

char buffer[1024] = ""; 

Cela définira tous les caractères buffer à 0. Ou encore, réglez uniquement le dernier caractère à 0, en faisant

buffer[index] = 0; 

après la boucle. En outre, (comme indiqué correctement par d'autres) si le texte est plus long que 1024 caractères, vous aurez une erreur de saturation de tampon - l'une des causes les plus souvent exploitées pour les problèmes de sécurité dans le logiciel.

+0

Êtes-vous sûr que 'char buffer [1024] =" ";' met tous les caractères à 0? N'est-ce pas égal à 'char buffer [0] = 0;'? Je ne sais pas, je demande. Je suis sûr que cela met tous les caractères à 0 'char buffer [1024] = {0};' – Gaim

+0

Oui, j'en suis sûr. "S'il y a moins d'initialiseurs dans une liste accolée qu'il n'y a d'éléments ou de membres d'agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue qu'il y a d'éléments dans le tableau, le reste de l'agrégat doit être initialisé implicitement de la même manière que les objets ayant une durée de stockage statique. " voir par exemple http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c –

+0

(Réponse à un commentaire supprimé) Non, ce n'est pas le cas. S'il vous plaît lire ce que j'ai cité et google certains. Cela définit le ** tableau entier ** à zéros. Pour être précis: * ou moins de caractères dans une chaîne littérale * (ce qui est vrai, car 0 <1024 caractères) * est utilisé pour initialiser un tableau de taille connue * (= 1024) * le reste de l'agrégat doit être initialisé implicitement même chose que les objets qui ont une durée de stockage statique * (qui est zéro, puisque les tableaux statiques sont initialisés à tous les zéros). –

0

Vous arrêtez de remplir le tampon lorsque vous arrivez à un retour à la ligne, le reste n'est donc pas initialisé. Vous pouvez réinitialiser votre tampon en le définissant avec: char buffer[1024] = {0}; Ceci corrigera votre problème.

2

Deux choses:

  1. Si la longueur de la ligne que vous lecture dépasse 1024 que vous écrivez passé le tampon qui est mauvais.
  2. Si la longueur est comprise entre , vous ne terminez pas la chaîne avec un caractère nul.

Vous pouvez essayer de le faire de la façon suivante. De cette façon, si vous trouvez une amende dépassant la taille de la mémoire tampon, nous la tronçons et ajoutons également le caractère nul à la fin de la boucle.

#define MAX 1024 

int main() 
{ 
char buffer [MAX]; 
int index = 0; 
char temp; 

do 
{ 
    // buffer full. 
    if(index == MAX-1) 
    break; 

    cin.get(temp); 
    buffer [ index ] = temp; 
    index ++; 

} 
while (temp != '\n'); 

// add null char at the end. 
buffer[index] = '\0'; 

cout << buffer << endl; 

return 0; 
} 
1

Plusieurs questions que je noté:

(1) Qu'est-ce que le codage des caractères est l'entrée. Vous pourriez lire 8,16 ou 32 caractères. Êtes-vous sûr de lire ASCII?

(2) Vous cherchez '\ n' le caractère de fin de ligne pourrait être '\ r \ n' ou '\ r' ou '\ n' selon votre plate-forme. Peut-être que le caractère est en soi votre carré?

+2

Il y a le problème principal avec l'octet zéro manquant dans la chaîne qui termine la séquence char. Ces notes sont utiles mais maintenant elles ne sont pas importantes – Gaim

0

Vous ne mettez pas un '\ 0' à la fin de la chaîne. En outre, vous devriez vraiment vérifier les conditions de dépassement de tampon. Arrêtez la lecture lorsque l'index arrive à 1024.