2016-12-06 2 views
3

Je suis en fait de travailler sur un C++ inverti chaîne/char [] MéthodesC++ fait ce qu'il veut | Char [] et inversé Cout char []

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

Le problème est, quand j'entrer dans une chaîne avec 3/5/7 et ainsi sur les lettres, alors il va inverser, alors si c'est correct, mais si j'entre une longueur de chaîne de 2/4/6 et ainsi de suite caractères il ya des caractères aléatoires sur son et et seulement quand j'entre ces longueur de nombre.

Je suis tellement confus parce que cette erreur apparaît seulement avec des nombres pairs.

Voici un petit exemple: Here's a little example:

Voici le nouveau code (tout fonctionne bien ici), je sais qu'il a quelque chose à voir avec le/0 à la fin du tableau, mais pourquoi seuls les nombres pairs .

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length + 1]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    output[length] = '\0'; 
    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

Quelqu'un peut-il m'aider à trouver une solution pour cela?

+1

Pour commencer, il vous manque '#include '. Aussi: recherchez ['std :: reverse''] (http://en.cppreference.com/w/cpp/algorithm/reverse). – rubenvb

+1

Pourquoi 'char * output = new char [longueur + 1];' au lieu de 'std :: string output (longueur + 1, 0);', vous prenez déjà 'std :: string' comme argument. –

+0

Je suis d'accord avec Ralph Tandetzky Réponse. J'ai remarqué une fuite de mémoire dans votre application, vous devez supprimer le tableau entier. donc 'delete output;' devrait être 'delete [] output' –

Répondre

3

Votre chaîne n'a pas de caractère nul. Essayez

void inverse(string input) 
{ 
    reverse(input.begin(), input.end()); 
    cout << input << endl; 
} 

Pour que cela fonctionne, vous devez inclure l'en-tête algorithm qui définit la fonction std::reverse().

La raison pour laquelle cela ne fonctionne pas pour les nombres pairs pourrait être le fait que les allocations de mémoire réservent généralement un peu plus de mémoire, de sorte que les limites de la mémoire sont correctement alignées. Par conséquent, arrondir à des nombres pairs n'est pas un gaspillage. C'est juste une supposition. Cependant, je vous recommande fortement d'éviter les comportements indéfinis.

0

Vous avez des déchets à la fin de votre chaîne car elle ne s'est pas terminée avec \0. L'impression de telles chaînes est un comportement indéfini en C++.

Vous étiez juste chanceux que votre code a travaillé pour des longueurs égales. Sur ma machine, par exemple, il fonctionne bien pour les longueurs de 1,2,3,5,6,7 et 8 et imprime des ordures pour 4.

UP: En fait, essayez d'éviter l'UB: le C++ La norme ne spécifie pas ce qui se passe quand vous avez l'UB - théoriquement, votre programme peut tomber en panne, ou votre ordinateur peut exploser, ou un démon peut apparaître de votre nez. Dans ce cas particulier, je recommanderais d'utiliser std::string comme conteneur pour output si, pour une raison quelconque, vous ne pouvez pas utiliser std::reverse ou de faire manuellement tout le travail sur place.