-5
votes

Comment économiser une chaîne imprimée d'une autre fonction?

Je veux tester une fonction avec le type "VOID" qui imprime quelque chose. Par conséquent, j'ai pensé à utiliser sprintf code> et enregistrer la sortie de printexample code> dans une matrice dans la fonction code> testtring code>.

Mon idée: P >

void printExample(){

   printf("This is a string");
}

void testString(){
   char stringArray[100];
   sprintf(stringArray,"%s",printExample());
   printf("%s",stringArray);
}

int main(){
   testString();
}

c

5 commentaires

Malheureusement, ces questions montrent l'absence de connaissances de base C ++ (ou C). C'est ma suggestion d'opter pour lire un bon livre C ++ au lieu d'essayer et une approche d'erreur de l'apprentissage C ++.


Je ne peux pas changer la valeur de retour "Void" dans quelque chose d'autre. Avez-vous des solutions différentes?


@Sergeya: Le manque de compréhension est peut-être pour la raison pour laquelle la question n'est pas claire, mais il existe une question utile ici peut-être en ce qui concerne de manière à capturer la production latérale d'une fonction pour les tests unitaires. C'est un objectif légitime, avec une suggestion invraisemblable. Je ne pense pas que beaucoup de livres (et dans ce cas C plutôt que c ++) aideront avec cela. Peut-être quelque chose que des cadres de test Unitaires unitaires?


@ Harmie176 Je conseille toujours de laisser les suggestions " mon idée " - de manière appropriée qui manifestement ne fonctionnera pas. Ce que vous obtiendrez en réponse, c'est beaucoup d'explication de la raison pour laquelle votre suggestion ne fonctionne pas, plutôt qu'une solution qui fonctionnera. Il y a une bonne question ici malgré les votes de descente causés par votre suggestion naïve et invraisemblable. Omettez cela et demandez simplement à la capture de la sortie standard pour les tests utilitaires. Obtenir la bonne terminologie et omettre une distraction inutile est la clé d'une bonne question claire.


@Clifford Il y a une certaine sagesse dans vos mots, j'admets.


3 Réponses :


-1
votes

Vous devez utiliser le retour au lieu de la fonction d'impression, Ensuite, il aura une sortie comme "ceci est une chaîne". Comme dans cette photo: Entrez la description de l'image ici


3 commentaires

Ne posez pas d'images hors site et ne postez pas de texte imagé texte qui pourrait facilement être copié et collé à votre réponse.


Veuillez poster le code directement dans votre réponse au lieu de relier une image. Vous pouvez lire sur la raison pour laquelle les images du code et des erreurs sont découragées ici .


Il essaie de tester l'effet secondaire d'une fonction - changer la fonction de défaite plutôt le but.



1
votes

La sortie printf est connu un "effet latéral" il n'est pas retourné par la fonction.

La solution quelque peu complexe dans ce cas est de rediriger stdout à un fichier, puis inspectez le contenu du fichier.

quelque chose comme: xxx

Note J'ai omis Erreur de vérification du code dans le fichier E / S pour plus de clarté. Vous voudrez peut-être ajouter quelques-unes!


0 commentaires

1
votes

fonction printf écrit à la console, mais il n'a rien à voir avec la valeur de retour d'une fonction dans laquelle elle est utilisée.

donc Void printexample () Imprimer Ceci est une chaîne , mais ce sera-t-il - comme le type de retour indique correctement - non rien qui pourrait être utilisé par l'appelant de printexample .

en utilisant printexample comme le paramètre sur un sprintf (STRINGARRAY, "% s", impressionnant ()) est un comportement non défini; sprintf (..., "% s" attend un char * -Argument, mais printexample est vide . Votre compilateur aurait dû vous averti.

si vous voulez printexample pour renvoyer une chaîne, vous devez écrire xxx

Ensuite, vous pouvez utiliser le résultat d'un appel à printexample directement comme argument sur un autre printf .

Si, toutefois, vous voulez tout simplement capturer tout qui est imprimé sur stdout également dans une chaîne (par exemple, pour effectuer des tests automatisés), vous pourriez alors tamponner temporairement stdout et accéder à ce tampon puis. < Pré> xxx


2 commentaires

Mais vous avez changé le comportement de la fonction qu'il tente de tester - ce qui n'est pas le point d'un test. La fonction n'imprime plus rien .


@Clifford: Droite; probablement n'a probablement pas eu l'intention d'OPS.