L'impression d'une chaîne de caractères en C, en utilisant une fonction
Je suis nouvelle marque de C et suis en train d'apprendre comment prendre une corde et l'imprimer à l'aide d'une fonction. Je vois des exemples partout à l'aide de while(ch = getchar(), ch >= 0)
, mais dès que je l'ai mis dans une fonction (au lieu de main()), il cesse de travailler. Maintenant, il est coincé dans une boucle sans fin... pourquoi est-ce?
//from main():
//printString("hello");
void printString(char *ch)
{
while (*ch = getchar(), *ch >= 0)
putchar(*ch);
}
- Est-il une raison pour laquelle nous ne pouvons pas utiliser printf?
- getchar() lit une entrée stdin. Voulez-vous que, ou voulez-vous imprimer "bonjour"?
- Je vais être de manipulation des données par l'analyse d'un fichier délimité par des barres verticales dans les colonnes de 15 caractères, mais j'ai voulu tirer le code du main et de le mettre dans une fonction et j'ai été tout simplement étouffement sur comment faire une boucle à travers une chaîne de caractères à partir de stdin.
Vous devez vous connecter pour publier un commentaire.
En fonction de votre description, vous voulez juste:
Votre fonction originale:
Fait beaucoup de choses:
dans le premier char pointé par
ch
(cela pourrait même ne pas fonctionner si vous passez une chaîne littérale.getchar()
lit la saisie de l'utilisateur à partir de stdin. Si vous souhaitez imprimer la chaîne passée en alors il n'y a pas besoin degetchar()
.Nous allons prendre étape par étape. La boucle que vous avez de lire un caractère à la fois à partir de stdin jusqu'à ce qu'il arrive à la fin-de-fichier. C'est ce que l'
ch >= 0
test vérifie: continuez à lire aussi longtemps que nous sommes à recevoir des caractères valides. Pour l'impression des caractères d'une chaîne, les changements de condition. Maintenant un caractère valide est quelque chose qui n'est pas NUL ('\0'
). Donc, nous allons changer la condition de la boucle pour:Suivante est de déterminer le corps de la boucle.
putchar(*ch)
est très bien; nous allons laisser cela il. Mais sansgetchar()
nous avons à comprendre ce que la mention équivalente à "obtenir le caractère suivant" est.Qui serait
ch++
. Ce progrès de lach
pointeur vers le caractère suivant dans la chaîne. Si on met ça à la fin de la boucle, puis nous allons imprimer un caractère, une avance d'une espace, puis vérifiez si le caractère suivant est non-NUL. Si c'est pour nous l'imprimer, l'avance, et vérifier.*ch != '\0'
à*ch
, ce qui signifie exactement la même chose; et il est également possible d'écrire le corps en une seule commande,putchar(*ch++);
-- comprendre pourquoi ce qui est possible est essentiel si l'on est à saisir le comportement de++
en C.Ce qui se passe ici est la suivante:
main
vous appelezprintString
avec un pointeur vers la chaîne de caractères "bonjour"printString
fonction tente de lire un caractère avecgetchar()
Les règles de la langue dire que la tentative de modification, que le " h " est un Comportement indéterminé. Si vous êtes chanceux, votre programme est en panne; si vous êtes très malchanceux, il apparaît que le programme fonctionne.
En bref:
getchar()
est utilisé pour la lecture;putchar()
est utilisé pour l'écriture.Et vous voulez écrire 5 lettre: 'h', 'e', 'l', 'o' et un autre 'o'.
Est-il quelque chose après que le dernier "o"? Il est! Un
'\0'
. Le zéro octet termine la chaîne. Donc, essayez ceci (avecprintString("hello");
) ...Ou vous pouvez écrire que dans une boucle (et l'appel de la principale avec des arguments différents) ...
Je voudrais juste faire
printf("%s",str);
ouputs(str);
puts
. Ne pas utiliser un fusil à éléphant pour tuer les puces.puts
ajoute le\n
à la fin sans condition. Vous pourriez vous le voulez, ou vous ne pourriez pas vouloir cela.fputs
n'ajoute un retour à la ligne de fuite, ni de perdre du temps à analyser le format de chaîne, ce qui serait le mieux.