8
votes

Comment prendre des espaces en entrée en c

Je voulais prendre une matrice de caractères à partir de la console et il inclut également des espaces blancs, la seule méthode que je connaisse en C est Scanf, mais cela manque d'arrêter de prendre des entrées une fois qu'il a frappé avec de l'espace blanc. Ce que je devrais faire?

Voici ce que je fais. xxx


0 commentaires

7 Réponses :


14
votes

Essayez d'utiliser Fgets (). Il va lire une ligne complète d'un flux de votre choix (Stdin, je suppose que vous recherchez). Un exemple de votre cas: xxx

fgets () lira au plus le nombre de caractères passés dans le deuxième argument (moins celui-ci). Pas de débordement de mémoire tampon, et vous obtiendrez toute la ligne jusqu'à ce que le personnage nouveau (ou jusqu'à EOF). Notez que puisque qu'un nombre maximum de caractères à lire est l'un des paramètres, il est possible que vous obtiendrez une ligne partielle. Vérifiez si le dernier caractère de la chaîne retournée est '\ N', et vous saurez que vous avez une ligne complète. La détection de l'EOF est assez simple aussi; A NULL Valeur de retour et un chèque sur errno devrait vous aider.

Merci à Chris (ci-dessous), pour le point sur les lignes partielles.


13 commentaires

Les fgets cherchent à avoir 3 paramètres, 1. Pointeur de charter. 2. Int 3. Fichier * Ce que je devrais entrer dans le deuxième et troisième paramètre?


+1 Mais notez que la ligne peut être plus longue que la limite de caractères, vous devez donc toujours vérifier que la ligne que vous avez lue se termine dans un '\ n' .


Merci mais je suis peu de problème lorsque je l'utilise, je prends fondamentalement une entrée de caractère avant cela, qui est scanf ("% s", nom); puis mettre vos fgets de ligne (adresse, 100, stdin); Il prend la première entrée, qui est le nom et le programme se termine, de sorte qu'il ne vient pas à la deuxième ligne. Mais si je demande juste demander une adresse, cela fonctionne. Comment je peux m'assurer qu'il fonctionne pour la deuxième ligne qui est des fgets (adresse, 100, stdin);


Je ne pense pas que je comprenne votre commentaire; Pourquoi le programme se termine-t-il? Pouvez-vous nous montrer un peu plus du code?


yah sûr, voici le code. Nom de caractère [20]; adresse de caractère [100]; scanf ("% s", et nom); fgets (adresse, 100, stdin);


Pendant que nous sommes sur ce sujet (et cela est associé), en raison de la manière étrange dans laquelle scanf () poignées WhitSpace, il est conseillé de ne pas mélanger les appels vers FSCANF () et appelle à fgets () (ou d'autres utilitaires de lecture) sur le même fichier. Le modèle le plus communément recommandé est de lire le code dans une chaîne avec fgets () puis utilisez sscanf () sur cette chaîne. De cette façon, nous avons le meilleur des deux mondes et nous les avons en toute sécurité.


Oh, c'est parce que votre scanf () ne lit pas la nouvelle ligne après l'entrée du nom. Donc, Scanf () renvoie et Fgets () lit immédiatement une nouvelle ligne. Utilisez Fgets () pour les deux appels, et je pense que vous serez défini.


@Chris je dois prendre le nom en premier, qui n'a pas d'espaces blancs, puis adresse, qui a des espaces blancs. Donc, je suis laissé avec ces options qui ne fonctionnent pas pour moi.


Je viens de pirater un peu, je mets getch () après Scanf, puis utilisez des fgets. Ça marche maintenant.


@itsaboutCode, Chris a une bonne suggestion pour vous, d'utiliser des fgets () pour lire des lignes entières, puis obtenir les pièces à l'aide de SSCANF (). Si vous avez vraiment votre coeur sur l'utilisation de Scanf () (que je ne recommande pas), ajoutez simplement une lecture mannequin entre lire le nom et l'adresse pour manger la nouvelle ligne supplémentaire.


@Charl merci man et c'est ce que j'ai fait. Il suffit de mettre un getch () entre eux et cela fonctionne bien.


@itsaboutCode, meilleure utilisation getc (stdin); parce que getch () fait partie de la norme ANSI C.


@Nick D - Pourquoi pas seulement getchar (); ?



0
votes

voir Fgets ()

fgets () se lit à la plupart des caractères de taille de la taille du flux et les stocke dans la mémoire tampon pointée par s. Lecture s'arrête après un EOF ou une nouvelle ligne. Si une nouvelle ligne est lue, elle est stockée dans le tampon. Un '\ 0' est stocké après le dernier caractère dans le tampon. xxx

Détail supplémentaire disponible dans de nombreuses questions, par exemple String-string-giber-scanf .

(en raison de la demande populaire, de réfraction à obtient () a été supprimé)


3 commentaires

De la page que vous avez liée: "N'utilisez jamais obtient (). Parce qu'il est impossible de dire sans connaître les données à l'avance combien de caractères obtiendront () lira () continuera () continuera de stocker des caractères au-delà de la fin du tampon , il est extrêmement dangereux d'utiliser. Il a été utilisé pour briser la sécurité informatique. Utilisez des fgets () à la place. "


Il est agréable de savoir que obtient () existe, mais il ne devrait jamais jamais être utilisé (en dehors du golf de code), et l'OP semble un peu nouveau, alors je suis sérieusement sérieusement Je recommande de ne pas mentionner qu'il existe.


Se mettre d'accord. obtient () référence retirée.



7
votes

Vous pouvez essayer quelque chose comme ceci: xxx


1 commentaires

C'est correct, mais ne sais pas pourquoi cela ne fonctionne pas quand je le fais. Nom de caractère [20]; adresse de caractère [100]; scanf ("% s", et nom); fgets (adresse, 100, stdin);



1
votes

Il y a façons de le faire avec Scanf () code> , mais à mon avis humble, ils deviennent laids rapidement. Le modèle commun (qui n'a pas encore été mentionné) est de lire la chaîne en avec fgets () code> puis utilisez sscanf () code> pour le traiter. sscanf () code> fonctionne comme scanf () code>, uniquement au lieu de traiter le flux d'entrée standard, il traite une chaîne que vous transmettez à elle (de la même manière printf ( ) code> et sprintf () code> sont liés). Les bases:

char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
  {
    // our three variables weren't all set - probably an invalid string
    // either handle the error or set default values here.
  }


0 commentaires

0
votes

Personnellement, j'utiliserais des fgets, mais cela a déjà été signalé ici. Un moyen de faire de l'utilisation de Scanf serait

scanf("%[^\n]", address);


0 commentaires

0
votes

Si vous souhaitez apporter une entrée jusqu'à la nouvelle ligne à l'aide d'une matrice dynamique à l'intérieur de la structure, cela peut être utile:

#include<stdio.h>
#include<stdlib.h>

struct student{
char *name;
};

int main()
{
        struct student s;

        s.name = malloc(sizeof(char *));

        printf("Name: ");
        // fgets(s.name, 10, stdin); // this would limit your input to 10 characters.

        scanf("%[^\n]", s.name);   

        printf("You Entered: \n\n");

        printf("%s\n", s.name);
}


0 commentaires

0
votes

Mon style.

 #include <stdio.h>

    #define charIsimUzunlugu 30

        struct personelTanim
        {       
            char adSoyad[charIsimUzunlugu];             
        } personel;

    printf(" your char       : ");
    scanf("%[^\n]",personel.adSoyad);

    printf("\n\n%s",personel.adSoyad);


0 commentaires