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 ...
3 Réponses :
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);
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
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; }
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 >
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 questr2
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 boucleRemarque: le commentaire
// Faire une copie avec strcpy
suggère que vous devriez utiliser la fonctionstrcpy
. Pas de boucle, appelez simplementstrcpy (str2, str1);
Page de documentation pourstrcpy
@ 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 direy = strlen (str2)
.