0
votes

Indésirable aléatoire lors de la copie d'un tableau

Quand j'exécute ce programme, il fonctionne bien mais pour une raison quelconque, je reçois une indemnité aléatoire dans la sortie. Si je saisis une chaîne supérieure à 11 caractères, je vais commencer à obtenir une indémocité aléatoire, si je saisis moins de 11 caractères, la malbouffe aléatoire n'apparaît pas et ça a l'air bien ...

Voici une image de l'erreur  Entrez la description de l'image ici xxx


10 commentaires

Semble fonctionner pour moi. À quel résultat attendez-vous et qu'observez-vous à la place.


@IgorTandetnik lien Voici une photo de l'erreur. Lorsque j'entre 12 caractères ou plus, cela donne des indésirables aléatoires. Mais à 11 caractères et moins, il n'y a pas d'ordure.


Vous aurez des chaînes de style C à terminaison nulle. str1 [i]! = '\ 0' arrête la copie avant que str2 n'obtienne le terminateur.


@ user4581301 qui a du sens! Comment copier le caractère de terminaison nul dans str2? str2 [i] = str1 [i] ?


Le chemin de moindre résistance serait d'ajouter str2 [i] = '\ 0'; après la boucle


Remarque: le commentaire // Faire une copie avec strcpy suggère que vous devriez utiliser la fonction strcpy . Pas de boucle, appelez simplement strcpy (str2, str1); Page de documentation pour strcpy


@ user4581301 oui c'était par erreur. J'ai supprimé les fonctions strcpy. Mais j'ai pu le comprendre, merci!


Juste une note latérale: vous connaissez la différence entre Taillef et Strlen ici, non?


@ user4581301 sizeof renvoie le nombre d'éléments qu'un tableau est alloué et strlen renvoie la longueur de caractère de la chaîne, je crois. Je viens d'ajouter ces calculs aléatoires pour m'aider à comprendre ce que je faisais de mal.


Vous ne voulez pas dire y = sizeof (str2) . Vous voulez sûrement dire y = strlen (str2) .


3 Réponses :


0
votes

Cela fonctionne .. essayez d'ajouter ci-dessous entre la fin du bloc pour et y = sizeof pour faciliter le débogage de

str2[i] = 0;
cout<<"\nstr2 is "<<i<<" characters:  ==" << str2 <<"==" << " \n" ;

et plus clairement est simplement getline (cin, str1);


1 commentaires

getline (cin, str1); n'est pas plus clair, il ne se compilerait pas ici. Cela fonctionnerait si str1 est un std :: string , pas un tableau de caractères



0
votes

Vous pouvez résoudre ce problème avec beaucoup moins de code en déclarant simplement deux chaînes. Définissez ensuite la chaîne 2 sur la chaîne 1.

#include <iostream>
using namespace std;

string str1;
string str2;

int main() {
    cout << "String 1 is now :\t" << str1 << endl;
    cout << "String 2 is now :\t" << str2 << endl;
    cout << "Enter a String" << endl;
    getline(cin, str1);
    str2 = str1;
    cout << "String 1 has been copied into string 2" << endl;
    cout << "String 1 is now :\t" << str1 << endl;
    cout << "String 2 is now :\t" << str2 << endl;
    return 0;
}


0 commentaires

0
votes

Vous n'annulez pas la fin de la nouvelle chaîne. Quelque chose comme ça après votre boucle fera l'affaire:

y = strlen(str2);

Cela a des valeurs codées en dur. Je changerais probablement cela.

Ce n'est pas nécessairement la meilleure façon de terminer par null votre chaîne. Mais au moins vous savez ce qui se passe maintenant.


De plus, sizeof est une constante de temps de compilation indiquant la taille du tableau. Je vais deviner que ce n'est pas ce que vous voulez, mais plutôt que vous voulez strlen () à la place. strlen () donne la longueur de la chaîne à la place.

// null terminate the string
if(i < 100) {
    str2[i] = 0;
} else {
    // terminate the last character anyway
    str2[99] = 0;
}

Mais je suppose que c'est une spéculation de ma part.

p >


0 commentaires