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. P>
7 Réponses :
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: 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 Merci à Chris (ci-dessous), pour le point sur les lignes partielles. p> p> NULL code> Valeur de retour et un chèque sur
errno code> devrait vous aider. p>
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' code>.
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 () code> poignées WhitSpace, il est conseillé de ne pas mélanger les appels vers
FSCANF () code> et appelle à
fgets () code> (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 () code> puis utilisez
sscanf () code> 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); code> parce que
getch () code> fait partie de la norme ANSI C.
@Nick D - Pourquoi pas seulement getchar (); code>?
voir Fgets () CODE>
fgets () code> 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. P> blockQuote>
xxx pré> Détail supplémentaire disponible dans de nombreuses questions, par exemple String-string-giber-scanf . p>
(en raison de la demande populaire, de réfraction à
obtient () code> a été supprimé) p> p>
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 () code> existe, mais il ne devrait jamais jamais i> ê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.
Vous pouvez essayer quelque chose comme ceci:
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);
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.
}
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);
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); }
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);