2017-03-08 78 views
1

我正在写一个功能,我有一个问题,scanf函数不能读空格键“”,我该如何解决它?如何使用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);  
    }    
} 

在tervellername部分,如果我想输入例如“杰森乔治”,如何扫描名称之间的空格键?

我使用下面的结构:

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

你只需要一个换行符(Return或Enter)来终止输入? – StoryTeller

+0

我试过gets()但它不会让我输入任何东西,它只是跳过这一行 –

+0

@StoryTeller我想要一些类似于scanf的东西,但我可以用space来输入。 “笔” –

回答

3

scanf()%s格式说明,只要它击中一个空白停止扫描。您无法使用它扫描space

引用C11,章§7.21.6.2,

s匹配的非空白字符的序列。

为了更好的和强大的替代方法,您可以使用fgets()扫描整个行,由newline终止。请记住,在这种情况下,fgets()也会扫描并存储所提供的缓冲区中的终止换行符,因此如果有必要,您需要手动将其删除。

+1

详细信息:“带有%s格式说明符的scanf()一旦遇到空白就立即停止扫描” - >使用'“%s”'前导空格不停止扫描,它们将被消耗并且不会被保存。它是非空格之后的空格,它会停止使用'“%s”'进行扫描。 OP的例子中有一个中间空间,这并不是直接观察到的。关于'fgets()'的好建议。 – chux

-1

Try this

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

输入串将读取空格分隔单词和在遇到一个新行字符(即\n)终止。另外要小心,这不会导致缓冲区溢出。因此相应地定义book.travellername的大小。

更新:我已更新格式说明符。

+5

's'不是格式说明符的一部分。 – StoryTeller

+0

@StoryTeller我不明白。这用于分隔空间输入。 – roottraveller

+0

看scanf的规格。有'%s'和'%[]'。我还必须提到,我没有倒下,只是想指出我认为是一个错字。 – StoryTeller