2011-05-14 5 views
1

D'accord, voici mon code jusqu'à présenterreurs étranges avec Visual C++

int main() 
{ 
    char buffer[10]; 
    int arraySize = -1; 
    FILE *fp; 
    int i; 
    char filename[10]; 
    int userNo = 1; 
    char stockArray[18][15]; 
    sprintf(filename, "file%d", userNo); 
    fp = fopen(filename, "r"); 
    while(fgets(buffer, 30, fp) != NULL) 
    { 
     if(buffer[0] == '<' && buffer[1] == 's') 
     { 
      arraySize++; 
     } 
     else if(buffer[0] == '<' && buffer[1] == '/'){printf("< char\n");} 
     else 
     { 
      int t = 0; 
      int r = 0; 
      while(buffer[t] != '>') 
      { 
       t++; 
      } 
      t++; 
      char holder[15] = {'\0'}; 
      while(buffer[t] != '<') 
      { 
       holder[r] = buffer[t]; 
       t++; 
       r++; 
      } 
      strncpy(stockArray[arraySize], holder, r); 
      printf("%s\n", stockArray[arraySize]); 
     } 
    } 
    fclose(fp); 
} 

Je suis en cours d'exécution en deux questions étranges. D'abord, quand je fais l'instruction printf, il imprime les données correctes, puis fait ce qui suit: si le premier mot est "banane" et le suivant est "123", il imprime "123ana" et ensuite un tas de caractère bizarre se termine avec, je ne plaisante pas, un visage souriant.

Ensuite, après que le programme est terminé et terminé, je reçois un "Run-Time Check Failure # 2 - Stack autour de la variable 'filename' a été corrompu." Erreur. J'utilise VS2010 et C++, et toute mon expérience jusqu'ici a été avec GCC et C, où je n'ai jamais rencontré ces problèmes avant. Tout conseil serait apprécié

+2

Vous pourriez envisager d'utiliser réellement C++, au lieu d'écrire du code C avec un compilateur C++. chaîne, vecteur, fstream, ostringstream etc. rendent la vie tellement plus facile. – ollb

+0

@Joe: Désolé, mais s'il le lance dans un compilateur C++, c'est C++. Juste parce que ce n'est pas _canonical_/moderne C++ ne change pas ça! –

+1

@tomalak - il n'y a rien dans ce code qui ressemble à du langage C++. C'est finalement une question sur le langage C et la bibliothèque d'exécution. – Joe

Répondre

7

Votre tampon d'entrée est de 10 caractères de long

char buffer[10]; 

Mais vous dire fgets de lire jusqu'à 30 caractères dans le tampon

fgets(buffer, 30, fp) 

qui est susceptible d'avoir " "effets drôles"!

+0

Très bien repéré :) –

+0

Et ce problème n'aurait rien à voir avec MSVC vs GCC ou C vs. C++. C'est un problème partout. –

+0

@Michael: vrai pour la plupart des problèmes de ce code, sinon tous. – Joe

2

Une chose que j'ai reconnue lors de l'inspection visuelle est que votre holder n'est pas correctement terminé par un zéro. Vous pouvez ajouter une ligne

holder[r++] = '\0'; 

après votre boucle while.

+0

'titulaire' est initialisé pour être rempli à zéro. Cependant, il est possible que la boucle while écrase le dernier élément (ou passé) si le buffer ne contient pas un caractère ''<' assez tôt. –

0

Il est très difficile de signaler le problème, sans comprendre ce que vous faites exactement et ce que le fichier contient.

Mais je suggère encore une chose et essayer:

strncpy(stockArray[arraySize], holder, r); 
stockArray[arraySize][r] = '\0'; //do this before printf! 

En général, assurez-vous que tous vos c-strings sont nuls terminaison. Ou bien vous ferez face au problème habituel qui se pose en raison du manque de caractère nul.

Questions connexes