J'étudie actuellement pour un examen et j'ai rencontré la question suivante dans un papier antérieur:
"Écrivez une fonction qui accepte deux chaînes. Comptez le nombre de
caractères dans chacun et renvoyez un pointeur sur la longue chaîne. Vous pouvez
Étendez la fonction fournie pour compléter la solution: " strong> p> C'est ce que j'ai jusqu'à présent, je suis sûr que je suis proche, mais cela n'imprime rien Au stdout, j'ai également eu ce problème avec d'autres questions, donc si quelqu'un pouvait me diriger dans la bonne direction, cela m'aiderait beaucoup! P> #include <stdio.h>
#include <string.h>
int main(void)
{
printf("The longest is %s", longest("HELLO", "HELLOO"));
return 0;
}
int longest(char *string1, char *string2)
{
char longer;
if (strlen(string1)>strlen(string2)){
longer=*string1;
}
else {
longer=*string2;
}
return longer;
}
4 Réponses :
Vous devez résoudre plusieurs problèmes avec la fonction la plus longue:
const char* longest(const char *string1, const char *string2) { const char *longer; if (strlen(string1)>strlen(string2)){ longer=string1; } else { longer=string2; } return longer; }
Vous êtes si proche!
Votre à la place nous redéfinir la variable code> plus longue code> de Cette version ajoute également un peu de ménage pour déclarer la fonction s'avère que vous pouvez simplifier la fonction un peu: p> Cette version, comme la vôtre, décide de manière arbitrairante que si Les chaînes sont en réalité la même longueur, cela donne la victoire à la première chaîne - ce n'est pas clair si cela vous importe ou non. P> edit strong> @vlad a souligné que cette La solution ne traite pas correctement avec les pointeurs Mais Vlad est juste, donc je comprends sa version ici: P> le plus long () code> fonction a l'intention de renvoyer une chaîne em>, mais cela renvoie un seul caractère, et c'est là que la roues tout tombe. p>
char code> à
char * code>, qui est un pointeur à un string. Maintenant, il va retourner la plus longue des deux chaînes. P>
la plus longue code> avant qu'elle soit utilisée Donc, le compilateur connaît les types impliqués. P>
const-Const * code> et bien sûr, il est correct. J'en ai intentionnellement laissé cela parce que je n'écrivais pas une fonction généralement utile et je crois que cela au-delà de ce que l'OP avait demandé. P>
char * longest( const char *s1, const char *s2 )
{
return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}
@ikegami - C'est juste comment vous le faites avec des paramètres généraux de chaîne lorsque la fonction elle-même ne se soucie pas du const ou non, mais l'appelant peut. Fonctions de la bibliothèque standard index code> et
strtstr code> Tout cela: c'est un compromis au mieux.
Dans l'affectation, il est écrit
... et retourne un pointeur sur la longue chaîne. P> blockQquote>
Cependant, votre fonction a le type de retour
int code> et dans la fonction, il existe des affectations qui n'ont pas de sens p>
xxx pré> et le La fonction doit être déclarée avant son utilisation. p>
La fonction peut regarder la manière suivante p>
xxx pré> voici un programme de démonstration. P>
HELLOO
Quel est le but du (char *) code> couler?
Pourquoi ne pas retourner const char * code>?
@KeithThompson en C Il n'y a pas de surcharge de fonction. La même fonction peut donc être appelée que pour des pointeurs constants et des pointeurs non constants. En conséquence, de telles fonctions renvoient des pointeurs non constants. Voir Déclarations de fonctions Standard C String. Par exemple, Char * Strstr (const Char * s1, const Char * S2);
Le moule masque une éventuelle erreur. Char * s = le plus long ("Bonjour", "Helloo"); * s = 'x'; met (s); code> ne nécessite pas de diagnostic mais a un comportement indéfini (probablement une défaillance de la segmentation). Le fait que
strtstr () code> a une faille similaire n'est pas une raison pour la répéter.
@Keiththompson vous êtes totalement faux. Ou écrire une proposition au comité standard C. Je suis sûr que cela sera rejeté. Au moins parce que la plupart des fonctions de chaîne C doivent être dupliquées dans ce cas. :) Un autre C n'a pas de surcharge de fonction. Donc, c'est une approche standard du problème.
@KeithThompson Ma réponse est la seule bonne et la meilleure réponse. :)
Qu'est-ce que je me trompe? N'est-ce pas le cas que le code que j'ai présenté (a) ne nécessite pas de diagnostic et (b) a un comportement indéfini? Je suis bien conscient que c n'a pas de surcharge. Une solution de contournement aurait pu être de fournir deux fonctions avec des noms différents. (C ++ surcharges strtstr code> pour cette raison.)
@Keiththompson à être juste, Question était répondit . L'approche de cette réponse utilise un idiome commun de la bibliothèque standard. Le repos est la bannière.
@KeithThompson Veuillez écrire une proposition au comité standard C. Moins de mots, plus d'actes. Toutes les autres implémentations présentées ici dans d'autres réponses ne sont pas en mesure de traiter avec des pointeurs constants. Donc, ils sont inutiles.
@Keiththompson Je voulais dire que deux fonctions sont nécessaires: une pour des pointeurs constants et autres pour des pointeurs non constants. Donc, soit pour des pointeurs constants, la fonction ne peut pas être appelée ou pour des pointeurs non constants. Sinon, vous devrez jeter un pointeur constant à un pointeur non constant. Cela rend votre code moins lisible.
@Vladfrommosw n'a-t-il pas besoin de quatre i> versions qui reflètent les quatre combinaisons de const / non correspondant aux deux paramètres?
@Stevefriedl Non, il suffit d'une version telle qu'elle est écrite dans ma réponse et dans la norme C. P, bail apprenez la norme C et suivez ses approches. Votre réponse est une mauvaise réponse car vous ne pouvez pas appeler votre mise en œuvre de la fonction pour des pointeurs constants. Et généralement des pointeurs vers des littéraux à cordes sont désormais déclarés comme des pointeurs constants même dans des programmes C.
Ok, pas besoin d'être sincères. Je parlais d'une langue qui apporte des surcharges telles que C ++; Votre version est aussi bonne que possible pour C et j'ai mis à jour ma réponse pour refléter votre approche il y a environ 5 minutes.
solution: problèmes dans votre code: p> en C, vous devez déclarer (pas nécessairement implémenté, mais les signatures doivent déjà être définies) la fonction avant de l'inscrire à votre code. Voir Ce lien ; p> li>
Votre type de retour est bien d'avoir: p>
int code> plutôt que
pointeur sur chaîne code> demandé par l'affectation. Par conséquent, les deux variables
plus longtemps code> et le type de retour de fonction
le plus long code> doivent être de type
char * code>. P> li>
ol>
const code> assure l'appelant de la fonction qu'aucune modification des chaînes ne serait effectuée. Li>
ul> p>
Votre
impression code> assume
le plus long code> renvoie un
char * code> (un pointeur sur un caractère qui agit comme un pointeur sur une chaîne). Vous avez défini la fonction pour renvoyer un
int code> et la valeur que vous renvoyez réellement est un
char code>. Vous étiez juste la première fois: il devrait renvoyer un
char * code>. En outre, la fonction doit être visible lorsque vous l'appelez. Le moyen le plus simple de faire est de déplacer la définition de
le plus long code> au-dessus de la définition de
principal code>. (Cela permettra également au compilateur de diagnostiquer des erreurs.)
1) Allumez les avertissements du compilateur et lisez-les; 2)
printf code> ne montrera rien sur des terminaux tamponnés de ligne jusqu'à ce que vous écriviez un caractère de nouvelle ligne
\ n code> ou appelez
fflush code>.