En passant de chaîne par une fonction (programmation en C)
J'ai juste commencé à apprendre les pointeurs, et après beaucoup d'ajout et de suppression de *
s mon code pour la conversion d'une chaîne saisie en majuscules, enfin, fonctionne..
#include <stdio.h>
char* upper(char *word);
int main()
{
char word[100];
printf("Enter a string: ");
gets(word);
printf("\nThe uppercase equivalent is: %s\n",upper(word));
return 0;
}
char* upper(char *word)
{
int i;
for (i=0;i<strlen(word);i++) word[i]=(word[i]>96&&word[i]<123)?word[i]-32:word[i];
return word;
}
Ma question est, tandis que l'appel de la fonction, j'ai envoyé word
qui est elle-même un pointeur, donc dans char* upper(char *word)
pourquoi ai-je besoin pour utiliser *word
? Est-il un pointeur vers un pointeur? Aussi, le char*
il est parce qu'elle renvoie un pointeur sur un caractère ou chaîne de droite? Merci de me préciser concernant la façon dont cela fonctionne.
Je suis confus de ce que vous demandez. Demandez-vous pourquoi il est supérieur(char *mot) et non supérieur(char mot)?
la fonction supérieure demande un pointeur en paramètre, et de vous fournir un pointeur (word). c'est la bonne façon pour autant que je sais.
Pour aider à éliminer la confusion, de changer le nom de la
Pourquoi ne pas utiliser
Mehta: Si vous avez trouvé une réponse utile, souvenez-vous de l'accepter
la fonction supérieure demande un pointeur en paramètre, et de vous fournir un pointeur (word). c'est la bonne façon pour autant que je sais.
Pour aider à éliminer la confusion, de changer le nom de la
word
paramètre upper
ou de la variable locale word
dans votre code.Pourquoi ne pas utiliser
toupper
dans la boucle?Mehta: Si vous avez trouvé une réponse utile, souvenez-vous de l'accepter
OriginalL'auteur Shashwat Black | 2011-12-17
Vous devez vous connecter pour publier un commentaire.
C'est parce que la type vous avez besoin ici est tout simplement "pointeur vers char", qui est dénoté comme
char *
, l'astérisque (*) est la partie de la spécification du type du paramètre. Ce n'est pas un "pointeur de pointeur de char", qui serait écrit commechar **
Quelques remarques supplémentaires:
Il semble que vous êtes confus au opérateur de déréférencement
*
(utilisé pour accéder à l'endroit où le pointeur de points) avec l'astérisque comme un pointeur de signer dans le type specifcations; vous n'êtes pas à l'aide d'un opérateur de déréférencement de n'importe où dans votre code, vous êtes seulement en utilisant l'astérisque dans le cadre de la spécification du type de! Voir ces exemples: pour déclarer la variable comme un pointeur vers char, vous devez écrire:Pour affecter une valeur à l'espace où
a
pointe (à l'aide de l'opérateur de déréférencement de), vous devez écrire:Un tableau (de char) n'est pas exactement égale à un pointeur (char) (voir aussi la question ici). Cependant, dans la plupart des cas, un tableau (de char) peut être converti en un (char) pointeur.
Votre fonction des changements de l'extérieur char array (et passes un pointeur); non seulement les majuscules de ce qui a été entré être imprimée par le printf, mais aussi la variable
word
de lamain
fonction sera modifiée de sorte qu'il tient la majuscule du mot entré. Prenez bien soin de la tel un effets secondaires est effectivement ce que vous voulez. Si vous ne voulez pas la fonction pour être en mesure de modifier la variable externe, vous pouvez écrirechar* upper(char const *word)
- mais alors vous devez changer votre définition de la fonction en tant que bien, afin de ne pas modifier directement leword
variable, sinon le Compilateur va se plaindre.OriginalL'auteur codeling
char upper(char c)
serait une fonction qui prend un caractère et retourne un caractère. Si vous voulez travailler avec les chaînes de la convention est que les chaînes sont des séquences de caractères terminée par un caractère nul. Vous ne pouvez pas passer l'intégralité de la chaîne à une fonction si vous passez le pointeur sur le premier caractère, doncchar *upper(char *s)
. Un pointeur vers un pointeur aurait deux*
comme danschar **pp
:supérieure pourrait également être mis en œuvre comme
void upper(char *str)
, mais il est plus commode d'avoir haut rendement de la chaîne passée. Vous faites usage de votre échantillon lorsque vousprintf
la chaîne est renvoyée par le haut.Juste un commentaire, vous pouvez optimiser votre supérieur de la fonction. Vous appelez
strlen
pour chaquei
. C les chaînes sont toujours null, de sorte que vous pouvez remplacer votrei < strlen(word)
avecword[i] != '\0'
(ouword[i] != 0
). Le code est mieux de lire si vous ne comparez pas contre 96 et 123 et soustraire 32 mais si vous vérifiez contre et calculer avec 'a', 'z', 'A', 'Z' ou le caractère que vous avez à l'esprit.OriginalL'auteur Werner Henze
l' *les mots c'est bien un pointeur bt le tableau word dans la fonction et le pointeur de la parole sont réellement pointant à la une et la même chose en passant les arguments jst une copie de la "pointee" c'est à dire le mot entré est passé et quelle que soit l'opération est fait est fait sur le pointeur de la parole, en fin de compte, nous devons retourner un pointeur de sorte que le type de retour est spécifiée sous la forme *.
OriginalL'auteur Abhishek Sai Shukla