2013-05-13 1 views
0

Voici ma question:inverse un tableau pointeur

écrire une fonction void reverse (char s []) qui inverse une chaîne de caractères. Par exemple, "Harry" devient "yrraH".

Et voici mon code:

void reverse(char s[]); 
int main() 
{ 
    char s [] = "Harry"; 
    reverse(s); 
    cout << s << endl; 

    system("PAUSE"); 
    return 0; 
} 

void reverse(char s[]) 
{ 
    int length = strlen(s); 
    int c, i ,j; 

    for(int i=0, j=length-1 ; i<j ; i++, j--) 
    { 
     c = s[i]; 
     s[i] = s[j]; 
     s[j] = c; 
    } 
} 

Il fonctionne parfaitement pour inverser la chaîne. Cependant, on m'a demandé de le faire en pointeur. Donc, à partir de ce que j'ai pensé, j'attribue d'abord un pointeur p pour obtenir le premier caractère en chaîne. Puis j'attribue un pointeur q pour obtenir le dernier caractère de la chaîne. La boucle I à travers pour inverser le tableau. Mais quand j'ai essayé de faire ceci pour obtenir le dernier char:

char *q = strlen(s-1); 

J'ai eu une erreur. Quelqu'un peut-il m'aider à résoudre ce problème en utilisant le pointeur?

partie Mise à jour

if (strlen(s) > 0(
{ 
char* first = &s[0]; 
char*last = &s[strlen(s)-1]; 
while(first < last) 
{ 
char temp = *first; 
*first = *last; 
*last = temp; 
++first; 
--last; 
} 
} 
+2

Est-ce que ce travail est fait? – nil

+0

Que signifie "On m'a demandé de le faire en pointeur"? Vous pourriez juste remplacer 'char []' par 'char *'. – juanchopanza

+0

Ya mais j'ai essayé. Je n'ai pas simplement posé la question ici sans solution. Il y a une erreur quand j'essaye de compter la longueur et l'assigner au pointeur. – Yvonne

Répondre

2

Essayez quelque chose comme ça.

char* left = &s[0]; 
char* right = &s[length-1]; 
for(; left<right ; left++, right--) 
{ 
    c = *left; 
    *left = *right; 
    *right = c; 
} 

Et lire ce http://www.cplusplus.com/doc/tutorial/pointers/

+0

Je fais de cette façon. Voir ma partie mise à jour et cela fonctionne. Merci beaucoup. – Yvonne

+0

Vous devriez utiliser 'std :: swap' dans la boucle. Ou s'il ne peut pas utiliser les fonctions de la bibliothèque, l'échange doit toujours être une fonction distincte. –

+0

Aussi, si vous vouliez être idiomatique, vous utiliseriez un intervalle semi-ouvert, comme tout le reste en C++. (Dans ce cas particulier, l'utilisation d'un intervalle semi-ouvert est un peu moins évident, mais c'est une bonne habitude à prendre en général.) –

7

Notez que la réponse de Bartosz Marcinkowski peut être tout votre instructeur recherche. Mais la façon dont j'écris ceci est:

void reverse(char* str) 
{ 
    char* end = str + strlen(str); 
    while (end > str) { 
     -- end; 
     swap(*str, *end); 
     ++ str; 
    } 
} 

Ceci a l'avantage de traiter les cas particuliers de chaînes vides et des chaînes de caractères simples correctement. On pourrait également affirmer qu'il est plus idiomatique, car il utilise une interface à moitié ouverte, qui est omniprésente en C++. Il vous préparera pour les itérateurs, qui définissent toujours des intervalles semi-ouverts (et utilisent plus souvent que les pointeurs pour ce genre de chose).

+0

Que fait str + strlen (str)? Résumer le caractère total de la chaîne? Ou obtenir le dernier caractère de str? – Yvonne

+0

Il ajoute la longueur de la chaîne ('strlen (str)') au pointeur. En d'autres termes, il en résulte un pointeur sur le '\ 0 'final. Je suppose que cette partie de l'objectif de vous obliger à utiliser des pointeurs serait de vous familiariser avec l'arithmétique du pointeur. 'str + strlen (str)' est beaucoup plus idiomatique que '& str [strlen (str)]'. (Que ce soit une bonne chose ou non est une autre question, mais c'est comme ça que C et C++ fonctionnent, et sont normalement écrits.) –

+0

Ne serait pas 'std :: reverse (str, str + std :: strlen (str)) 'être plus idiomatique C++? :) – msandiford

0

Essayez ce code pour la chaîne d'inversion.

void reverse(char str[], int len) 
{ 
    char *fptr = str; 
    char *lptr = str + len -1; 
    char ch = 0; 
    while(fptr < lptr) 
    { 
      ch = *fptr; 
      *fptr = *lptr; 
      *lptr = ch; 
      *fptr++; 
      *lptr--; 
    } 
}