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