1
votes

getchar ()! = '' et getchar () = ''

J'ai du mal à comprendre ce que font getchar ()! = '' et getchar () = '' dans mon code. Pourquoi faut-il qu'il y ait des opposés. L'utilisateur peut saisir des espaces supplémentaires entre le prénom et le nom, et avant le prénom et après le nom.

#include <stdio.h>

int main(void) {

    char c, initial;

    printf("Enter a first and last name: ");
    scanf(" %c", &initial);
    printf("%c\n", initial);
    while ((c = getchar()) != ' ')
        ;

    while ((c = getchar()) == ' ')
        ;

    do {
        putchar(c);
    } while ((c = getchar()) != '\n' && c != ' ');

    printf(", %c.\n", initial);

    return 0;
}


6 commentaires

Veuillez copier-coller votre code


Sans même regarder votre code, je peux vous dire que toute apparition de getchar () = '' n'a qu'un seul but: provoquer l'échec de la compilation.


Dans tous les cas, si c'est votre code alors comment ne pas savoir au moins à quoi servent ses différents bits censés ?


Ce n'est pas mon code. Je regarde la réponse de quelqu'un d'autre pour le même exercice dans un manuel de programmation. Le code n'échoue cependant pas et fonctionne parfaitement.


@Nick "ce que font getchar ()! = '' Et getchar () = '' dans mon code" Supprimez-les immédiatement! :)


votre question indique: et getchar () = '' qui ne se compileraient pas. Cependant le code est correct avec: while ((c = getchar ()) == '')


3 Réponses :


2
votes

Dans cet extrait de code

printf("%c\n", initial);

La première lettre du prénom est lue et les autres lettres sont ignorées.

Cette boucle

Fisher, N.

saute les espaces entre le prénom et le deuxième nom.

Cette boucle

Nick     Fisher

renvoie toutes les lettres du deuxième nom.

Enfin, la première lettre du prénom est affichée après le deuxième nom complet.

Donc, si vous avez entré par exemple

do {
    putchar(c);
} while ((c = getchar()) != '\n' && c != ' ');

alors la sortie devrait être

while ((c = getchar()) == ' ')
    ;

Prendre dans compte que vous devez supprimer la déclaration

scanf(" %c", &initial);
// printf("%c\n", initial); <== remove this statement
while ((c = getchar()) != ' ')
    ;

c'est une déclaration redondante.


6 commentaires

Merci beaucoup! Cela l'explique parfaitement


Le code d'origine ne fonctionnera pas comme prévu s'il y a des espaces blancs en tête dans la ligne saisie.


@LxerLx Pourquoi en avez-vous décidé ainsi? Les espaces blancs principaux sont ignorés.


la sortie n'est pas ce qui se passera réellement. La première ligne de la sortie sera l'initiale en raison de: printf ("% c \ n", initial);


@VladfromMoscow Vous avez raison. J'ai oublié l'espace avant % c .


Oui, la déclaration redondante a été ajoutée afin que je puisse essayer de comprendre ce qui se passait.



0
votes

regarding:

while ((c = getchar()) != ' ')
    ;

while ((c = getchar()) == ' ')
    ;

la première boucle while () consomme le reste du prénom

la seconde tandis que ( ) utilise les espaces entre le prénom et le nom.


0 commentaires

0
votes

N'y a-t-il pas un problème en utilisant un caractère pour l'initiale, puis en y écrivant beaucoup de caractères? Je pense que vous n'utilisez pas de mémoire allouée pour le nom.
Et le premier printf ("% c \ n", initial); devrait générer une sortie du premier caractère entré.

Soooo ...
Entrée:
Nick Fisher

Production:
N
Fisher, N.

ou:

Fisher, N.
ou:
plantage du programme en raison d'un accès mémoire interdit

Salutations André


0 commentaires