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
5 Réponses :
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.
"Warning: array subscript has type" char "" est l'erreur que j'obtiens lorsque je fais cela /:
@lulu: temp doit être retapé en un char .
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.
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 .
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--;
}
}
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";
}
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;
}
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 a>, il n'est pas décrit par POSIX.1-2017 . Il se trouve dans BSD , sous Linux et MSDN a > ... et éventuellement d'autres implémentations.
Oups ... ce n'est pas dans les pages de manuel Linux < / a>
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