0
votes

Sélection du plus long de deux chaînes à l'aide de pointeurs

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> xxx pré>

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;
}


2 commentaires

Votre impression assume le plus long renvoie un char * (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 et la valeur que vous renvoyez réellement est un char . Vous étiez juste la première fois: il devrait renvoyer un char * . 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 au-dessus de la définition de principal . (Cela permettra également au compilateur de diagnostiquer des erreurs.)


1) Allumez les avertissements du compilateur et lisez-les; 2) printf ne montrera rien sur des terminaux tamponnés de ligne jusqu'à ce que vous écriviez un caractère de nouvelle ligne \ n ou appelez fflush .


4 Réponses :


0
votes

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;
}


0 commentaires

1
votes

Vous êtes si proche!

Votre 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>

à la place nous redéfinir la variable code> plus longue code> de char code> à char * code>, qui est un pointeur à un string. Maintenant, il va retourner la plus longue des deux chaînes. P> xxx pré>

Cette version ajoute également un peu de ménage pour déclarer la fonction la plus longue code> avant qu'elle soit utilisée Donc, le compilateur connaît les types impliqués. P>

s'avère que vous pouvez simplifier la fonction un peu: p> xxx pré>

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 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>

Mais Vlad est juste, donc je comprends sa version ici: P>

char * longest( const char *s1, const char *s2 )
{
    return ( char * )( strlen( s1 ) < strlen( s2 ) ? s2 : s1 );
}


1 commentaires

@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 et strtstr Tout cela: c'est un compromis au mieux.



1
votes

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


13 commentaires

Quel est le but du (char *) couler?


Pourquoi ne pas retourner const char * ?


@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); ne nécessite pas de diagnostic mais a un comportement indéfini (probablement une défaillance de la segmentation). Le fait que strtstr () 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 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 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.



0
votes

solution: xxx

problèmes dans votre code:

  1. 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 ;

  2. Votre type de retour est int plutôt que pointeur sur chaîne demandé par l'affectation. Par conséquent, les deux variables plus longtemps et le type de retour de fonction le plus long doivent être de type char * .

    bien d'avoir:

    • en utilisant const assure l'appelant de la fonction qu'aucune modification des chaînes ne serait effectuée.

0 commentaires