2010-09-25 4 views
0

Je suis tout nouveau à C et j'essaie d'apprendre à prendre une chaîne et à l'imprimer en utilisant une fonction. Je vois des exemples partout en utilisant while(ch = getchar(), ch >= 0), mais dès que je le mets dans une fonction (au lieu de main()), il cesse de fonctionner. En ce moment, il est coincé dans une boucle sans fin ... pourquoi est-ce?Impression d'une chaîne en C à l'aide d'une fonction

// from main(): 
// printString("hello"); 

void printString(char *ch) 
{ 
    while (*ch = getchar(), *ch >= 0) 
    putchar(*ch); 
} 
+0

est-il une raison que nous pouvons » t utilise printf? – KLee1

+0

getchar() lit l'entrée de stdin. Voulez-vous cela, ou voulez-vous imprimer "bonjour"? –

+0

Je vais en fait manipuler les données en analysant un fichier délimité par des barres verticales dans des colonnes de 15 caractères, mais je voulais sortir le code de main et le mettre dans une fonction et j'étais simplement en train de m'étrangler sur la façon de passer une chaîne de stdin. – bafromca

Répondre

2

D'après votre description, vous voulez juste:

void printString(char *ch) 
{ 
    while(*ch) { 
    putchar(*ch); 
    ch++; 
    } 
} 

Votre fonction originale:

void printString(char *ch) 
{ 
    while (*ch = getchar(), *ch >= 0) 
    putchar(*ch); 
} 

Est-ce que beaucoup de choses :

  1. lit des personnages de stdin
  2. stocke le caractère lu de stdin dans le premier caractère pointé par ch (cela pourrait ne pas fonctionner même si vous passez dans une chaîne littérale.
  3. écrit des caractères dans stdout.
  4. Termine lorsque le caractère lu est < 0 (cela ne fonctionnera pas sur certaines plates-formes.) Puisque le résultat est stocké dans un caractère, vous ne pouvez pas distinguer EOF d'un caractère valide.) renvoie un int afin que vous puissiez vérifier pour EOF)
+0

Vous pouvez également utiliser des puts. –

+0

Probablement sans l'accolade manquante, cependant. – Porculus

+0

Termine PAS lorsque le caractère lu est <0; Termine ALSO lorsque le caractère lu est == 0 – user411313

0

Je voudrais juste faire printf("%s",str); ou puts(str);

+2

Ou 'puts'. Ne pas utiliser un pistolet à éléphant pour tuer une puce. –

+0

Cela doit être fait dans une fonction parce que la fonction formera réellement la chaîne ... pardon si je n'ai pas bien expliqué cela. – bafromca

+0

@Ben Voigt: Ce n'est pas pareil. 'puts' ajoute le' \ n' à la fin inconditionnellement. Vous pourriez le vouloir, ou vous pourriez ne pas le vouloir. – AnT

3

getchar() lit l'entrée utilisateur de stdin. Si vous voulez imprimer la chaîne transmise, vous n'avez pas besoin de getchar().

Procédons étape par étape. La boucle que vous avez lue un caractère à la fois depuis stdin jusqu'à ce qu'elle atteigne la fin du fichier. C'est ce que le test ch >= 0 vérifie: continuez à lire tant que nous obtenons des caractères valides. Pour imprimer les caractères d'une chaîne, la condition change. Maintenant, un caractère valide est tout ce qui n'est pas NUL ('\0'). Donc, nous allons changer la condition de la boucle à:

while (*ch != '\0') 

Ensuite, est de déterminer le corps de la boucle. putchar(*ch) va bien; nous allons laisser ça là. Mais sans getchar() nous devons comprendre ce que l'instruction équivalente à "obtenir le prochain caractère" est.

Ce serait ch++. Cela avance le pointeur ch vers le caractère suivant dans la chaîne. Si nous mettons cela à la fin de la boucle, nous allons imprimer un caractère, avancer d'un espace, puis vérifier si le caractère suivant est non-NUL. Si c'est le cas, nous l'imprimons, nous l'avançons et nous vérifions.

while (*ch != '\0') { 
    putchar(*ch); 
    ch++; 
} 
+0

Bien que ce soit correct, il n'est pas idiomatique. La plupart des gens simplifieraient '* 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 cela est possible est essentiel si l'on veut saisir le comportement de '++' en C. – Porculus

3

Qu'est-ce qui se passe ici est la suivante:

  1. dans la fonction main vous appelez printString avec un pointeur sur la chaîne « bonjour »
  2. la fonction printString tente de lire un personnage avec getchar()
  3. et enregistrer ce caractère à la place du 'h'

Les règles de la langue disent que tenter de changer ce 'h' est un comportement indéfini. Si vous avez de la chance, votre programme se bloque; Si vous êtes très malchanceux, le programme fonctionnera. En résumé, getchar() est utilisé pour la lecture; putchar() est utilisé pour l'écriture.

Et vous voulez écrire 5 lettres: «h», «e», «l», «o», et un autre «o».

 
    hello 
    ^   ch is a pointer 
    ch   *ch is 'h' -- ch points to an 'h' 

Y at-il quelque chose après ce dernier 'o'? Il y a! A '\0'. L'octet zéro termine la chaîne. Donc, essayez ceci (avec printString("hello");) ...

void printString(char *ch) 
{ 
    putchar(*ch); /* print 'h' */ 
    ch = ch + 1; /* point to the next letter. */ 
        /* Note we're changing the pointer, */ 
        /* not what it points to: ch now points to the 'e' */ 
    putchar(*ch); /* print 'e' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'l' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'l' */ 
    ch = ch + 1; /* point to the next letter. */ 
    putchar(*ch); /* print 'o' */ 
    ch = ch + 1; /* point to the next letter. What next letter? The '\0'! */ 
} 

Ou vous pouvez écrire que dans une boucle (et appeler à partir principale avec des arguments différents) ...

void printString(char *ch) 
{ 
    while (*ch != '\0') 
    { 
     putchar(*ch); /* print letter */ 
     ch = ch + 1; /* point to the next letter. */ 
    } 
}