2017-01-09 1 views
0

Dans la partie suivante du code de swap de chaîneInversion de chaîne en C++

end = &str[len - 1]; 

je ne comprends pas la partie d'adressage. Quand je le fais sans la partie d'adressage il continue à courir mais me donne un avertissement que "des valeurs de type char ne peuvent pas être assignées à l'identité de type char". Voici le code complet:

#include<iostream> 
    #include<cstring> 
    using namespace std; 

int main() 
{ 
    char str[] = "This is a test"; 
    char *start, *end; 
    int len; 
    int t; 

    cout << "Original " << str << "\n"; 
    len = strlen(str); 
    start = str; 
    end = str[len - 1]; 

//this reverses the string 
    while (start < end) { 

     t = *start; 
     *start = *end; 
     *end = t; 

     start++; 
     end--; 

    } 
    cout << "Reversed" << str << "\n"; 
    system("PAUSE"); 
    return 0; 
} 
+0

* "Chaîne d'inversion dans ** C++ **" * pas comme ceci, s'il vous plaît. Pas comme ça. Je respecte les programmeurs C et C, et ce qui leur appartient, doit leur être donné. Vous avez un type dédié pour les chaînes, vous avez des algorithmes, vous avez 'swap' ... C++ n'est pas seulement' cout'. Désolé, pour me plaindre, mais je me sens un peu attristé. – luk32

+0

Je travaille sur des exemples à travers un manuel. – Jeff

+0

Je le signalerais en rouge. Sérieusement. Je le considérerais comme nuisible. Cela vous apprend des choses obsolètes. Vous n'auriez jamais un tel problème dans un programme C++ approprié ... ou est-ce un livre C? Cela ressemble à du code C avec 'cout'. C'est ainsi que les programmeurs C ont enseigné le C++ il y a 15-20 ans. Au moins c'est mon expérience. – luk32

Répondre

1

je ne comprends pas la partie d'adressage.

Compte tenu

char str[] = "This is a test"; 
char *start, *end; 
len = strlen(str); 

alors end est pointeur vers un char, et

end = &str[len - 1]; // `end` points to the last character (before the `\0`) 

Vous devez utiliser l'opérateur & (adresse de) parce que end est le pointeur et il doit donc être attribué à l'adresse de quelque chose (ici l'adresse du dernier caractère de la chaîne).

Quand je le fais sans la partie consacrée il fonctionne encore

Je ne pense pas que ce sera - vous aurait eu une erreur de compilation

end = str[len - 1]; // invalid conversion from ‘char’ to ‘char*’ 
+0

J'ai une question de suivi pls. Comment se fait-il que ce qui suit n'ait pas besoin de pointer vers une adresse: start = str; – Jeff

+0

@Jeff - c'est parce que 'str' est une chaîne (pas un seul caractère) – artm

+0

Merci. Je vois maintenant. – Jeff

0

Vous devez konw le type de end est char*, mais le type de str[len-1] est char, donc vous devez changer le type str[n-1] à char*, donc vous avez besoin &str[len-1].

Mais si vous utilisez string, il y aura une méthode simple:

Utilisez le std :: méthode inverse de STL:

std :: inverse (str.begin(), str.end ()); // str shoud be string type

Vous devez inclure la bibliothèque "algorithm", #include.

+0

Votre message ne répond pas à la question de l'OP. –

+1

@RSahu L'OP n'a pas posé de question. Une estimation raisonnable est que la question est "qu'est-ce qu'un moyen sensé d'inverser une chaîne en C++". –

+0

@DavidSchwartz, ils ont fait un peu: * Je ne comprends pas la partie d'adressage * –

0

Peut-être que cela peut aider

void reverse (char word[]) 
{ 
    int left = 0; 
    int right = strlen(word) - 1; 

    while (left < right) 
    { 
     char temp = word[left]; 
     word[left] = word[right]; 
     word[right] = temp; 
     left++; 
     right--; 
    } 
    cout << word; 

} 

J'espère que cela vous donne l'idée.