2017-03-08 4 views
1

J'écris une fuction et j'ai un problème, la fonction scanf ne peut pas lire la barre d'espace "", comment puis-je le résoudre?Comment puis-je entrer une barre d'espace en entrée en utilisant scanf?

void add() 
{ 
char choose2; 

FILE *fp; 
struct booking book;  
system("cls");   
fp=fopen("hotelbooking.txt","a"); 
    if(fp == NULL) 
    { 
     printf("There are no data file!"); 
    } 
    else 
    { 
     printf("Add New Hotel Booking Record(s)\n"); 

     printf(" Name of Traveller: \n"); 
     scanf("%s",book.travellername); 
     fprintf(fp,"\n%s",book.travellername); 

     printf(" Destination: "); 
     scanf("%s",book.destination); 
     fprintf(fp,"\n%s",book.destination);        
     fclose(fp);  
    }    
} 

Dans la partie nom_table, si je souhaite saisir par ex. "Jason George", Comment puis-je scanner la barre d'espace entre le nom?

J'utilise la structure ci-dessous:

struct booking 
    { 
    char travellername[20]; 
    char destination[20]; 
    }book; 
+0

Vous ne voulez qu'un saut de ligne (Retour ou Entrée) pour terminer l'entrée? – StoryTeller

+0

J'ai essayé gets() mais il ne me laissera pas entrer dans anythings, il sautera simplement la ligne –

+0

@StoryTeller Je veux quelque chose de similaire à scanf mais je peux entrer wors avec de l'espace par exemple. "The Pen" –

Répondre

3

scanf() avec spécificateur de format %s arrête la numérisation dès qu'il frappe un espace. Vous ne pouvez pas numériser space en l'utilisant.

C11 Citant, chapitre §7.21.6.2,

s correspond à une séquence de caractères non-espace blanc.

Pour une meilleure alternative et robuste, vous pouvez utiliser fgets() pour balayer une ligne entière, terminée par un newline. Rappelez-vous, dans ce cas, fgets() scanne et stocke la nouvelle ligne de fin également dans le tampon fourni, donc vous devez vous en débarrasser manuellement, si cela est important.

+1

Détail: "scanf() avec le spécificateur de format% s arrête l'analyse dès qu'il atteint un espace" -> Avec '"% s "' les espaces de début n'arrêtent pas l'analyse, ils sont consommés et non sauvegardés. Ce sont des espaces après un espace non-blanc qui s'arrêtent d'être analysés avec '"% s "'. Ceci n'est pas directement observé avec l'exemple d'OP qui a un espace intermédiaire. Bonne suggestion à propos de 'fgets()'. – chux

-1

Try this

scanf("%[^\n]", book.travellername); 

chaîne entrée lira les mots séparés par des espaces et mettre fin à la rencontre sur un retour à la ligne (à savoir \n). Veillez également à ce que cela n'entraîne pas de débordements de tampon. Définissez donc la taille de book.travellername en conséquence.

mise à jour: J'ai mis à jour le spécificateur de format.

+5

Le 's' ne fait pas partie du spécificateur de format. – StoryTeller

+0

@StoryTeller Je ne comprends pas. cela a l'habitude de travailler pour l'entrée séparée par l'espace. – roottraveller

+0

Regardez la spécification pour scanf. Il y a '% s' et'% [] '. Je dois également mentionner que je n'ai pas downvote, je voulais juste souligner ce que je pensais être une faute de frappe. – StoryTeller