1
votes

Inverser une chaîne en C en utilisant la boucle while

Ce code est fondamentalement censé prendre une chaîne, disons par exemple que c'est "abc de fgh" la sortie devrait être

void stringReverse(char* s){

    char* i = 0;
    char* j = strlen(s)-1;
    //in order to swap the characters s[i] and s[j] make a temp
    char* temp;

    while(i < j){
        temp = i;
        i = j;
        j = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Mon code montré ici, met la chaîne dans un ligne mais il ne les inverse pas. J'ai du mal à trouver cette partie et comment utiliser les char * s de mon argument dans la méthode. toute aide dans la bonne direction serait formidable!

cba
ed
hgf

c

7 commentaires

Pourquoi void stringReverse (char * s) renvoie quelque chose?


@Blaze l'a corrigé :) merci pour cette capture


@Jabberwocky dois-je implémenter le caractère d'une manière ou d'une autre?


@lulu Je n'ai pas compris votre dernier commentaire. Peut-être devriez-vous modifier votre question et publier une exemple minimal reproductible .


Notez que si vous appelez votre fonction avec char * p = "foobar"; stringReverse (p); vous tenterez de modifier une chaîne en lecture seule


@pmg désolé, c'est déroutant pour moi. signification de chaîne en lecture seule ..?


@lulu: tout savoir sur les chaînes en lecture seule dans ceci SO question et réponses


5 Réponses :


2
votes

La valeur de i et j ne sont qu'un nombre qui représente l'emplacement dans la chaîne où la valeur qui vous intéresse existe.

Mais quand vous le faites l'échange réel, vous semblez avoir manqué cela, même si votre commentaire indique la bonne solution.

Donc au lieu de:

temp = s[i];
s[i] = s[j];
s[j] = temp;

Essayez: p>

temp = i;
i = j;
j = temp;

également comme mentionné dans les commentaires, si une fonction est déclarée comme renvoyant void, vous ne devriez pas renvoyer de valeur.


2 commentaires

"Warning: array subscript has type" char "" est l'erreur que j'obtiens lorsque je fais cela /:


@lulu: temp doit être retapé en un char .



5
votes

Votre code semble mélanger les concepts d'utilisation d'un index (comme 0 ou strlen (s) -1 ) ou l'utilisation de pointeurs. Même dans un commentaire, vous avez écrit "permutez les caractères s [i] et s [j] " mais vous avez déclaré i et j en tant que variables char * .

La deuxième erreur est que vous permutez les valeurs du pointeur, pas les caractères vers lesquels pointent les pointeurs.

Vous devez décider si vous voulez utiliser des pointeurs ou un index pour accéder aux caractères.

Solution utilisant des pointeurs:

void stringReverse(char* s){

    size_t i = 0;
    size_t j = strlen(s)-1;
    //in order to swap the characters s[i] and s[j] make a temp
    char temp;

    while(i < j){
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Solution utilisant l'index:

void stringReverse(char* s){

    //in order to swap the characters s[i] and s[j] make a temp
    char temp;
    char* i = s;
    /* according to the standard, the behavior is undefined if the result
     * would be one before the first array element, so we cannot rely on
     * char* j = s + strlen(s) - 1;
     * to work correct. */
    char* j = s + strlen(s); 
    if(j > i) j--; // subtract only if defined by the C standard.

    while(i < j){
        temp = *i;
        *i = *j;
        *j = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Le compilateur devrait avertir de certains des problèmes dans le code source d'origine si suffisamment d'avertissements sont activés. Je suggère de toujours activer autant d'avertissements que possible.


2 commentaires

Naturellement, on le réécrirait pour utiliser une boucle for à la place, au lieu de se limiter à while . Et déclarez et initialisez temp au début du corps de la boucle, au lieu de le déclarer avant la boucle. De plus, un commentaire sur la demande et le respect des avertissements du compilateur ne serait pas un problème. Sinon sympa.


s + strlen (s) -1; conduit à un comportement indéfini lorsque s [0] == 0 .



0
votes

Vous le voulez. Explication dans les commentaires.

void stringReverse(char* s) {

  int i = 0;                // int instead of char*
  int j = strlen(s) - 1;    // int instead of char*
  char temp;                // char instead of char*

  while (i < j) {
    temp = s[i];            // actually exchange the two characters
    s[i] = s[j];
    s[j] = temp;

    i++;
    j--;
  }
}


0 commentaires

0
votes

Ici, vous allez sans utiliser de variable temporaire, je n'ai pas testé ce code, voici comment je l'ai fait quand j'avais rencontré une question similaire dans une interview

    void stringReverse(char* str){

        char* i = 0;
        char* j = strlen(str);


    while(i < (j/2)){
        strl[j]= str[j-i-1];
        str[i+1] = str[j];
        str[i]=str[j];
        i++;       
    }
   str[j]="\0";

    }


0 commentaires

0
votes

Essayez ceci fonctionne également

#include<stdio.h> 
#include<string.h>  
int main() 
{ 
   char str[10] = "abc"; 

   printf("The given string is =%s\n",str); 

   printf("After reversing string is =%s",strrev(str)); 

   return 0; 
} 


7 commentaires

strrev (str) inversera la chaîne


strrev () est disponible ?? je ne trouve pas cette API dans mes pages de manuel


Cette fonction renvoie la chaîne après avoir inversé la chaîne donnée


J'utilise la plateforme Linux Je ne vois pas cette API présente dans mes pages de manuel, sur quelle plateforme avez-vous exécuté votre code?


recherche fonction strrev dans c. tu l'auras


strrev () n'est pas décrit par le norme C11 , il n'est pas décrit par POSIX.1-2017 . Il se trouve dans BSD , sous Linux et MSDN ... et éventuellement d'autres implémentations.


Oups ... ce n'est pas dans les pages de manuel Linux < / a>