2017-03-18 120 views
0

本文附帶的代碼是較大程序的一部分,但我在輸入結構變量「標題」和「作者」時遇到問題。 該程序似乎循環它並轉到下一行。另外,雖然在字符串說明符中的's'前面使用[^ \ n],但它執行相同的操作,但我讀取它時使用scanf將字符串作爲輸入。閱讀一些帖子,但無法找出問題。 剛開始C,任何幫助將不勝感激!使用scanf進行結構輸入

struct books{ 
char title[30]; 
char author[30]; 
char subject[20]; 
int quantity; 
int book_id; 
char *category; 
int count; 
float price; 
}; 
struct books book; 

book.book_id=id; 
printf("\n\n\t\tBook Name:\n\t\t"); 
scanf(" %s",book.title); 
printf("\n\n\t\tAuthor:\n\t\t"); 
scanf(" %[^\n]s",book.author); 
printf("\n\n\t\tQuantity:\n\t\t"); 
scanf("%d",&book.quantity); 
printf("\n\n\t\tPrice:\n\t\t"); 
scanf("%f",&book.price); 
+0

它可能是%s之前的空格 – Luci

+1

您的格式說明符是否確實包含'[^ \ n]'而不是'[^ \ n]'?你不希望那裏有額外的空間。 '[^ \ n]'特別指定'\ n',而不是任何空格作爲字符串分隔符。如果您嘗試過,那麼這是您應該發佈的代碼。當輸入不包含空格或者是一個問題時它工作嗎? – Clifford

+1

[mcve],請!順便說一句,在'[^ \ n]'之後''s是錯誤的,應該刪除。這雖然沒有任何效果,但完全是多餘的。 –

回答

0

在輸入「book.title」和「book.author」的字符串說明符中的s之前使用[^ \ n]。

我用這些修改來執行你的代碼。代碼是正確的。

您一直採用空格分隔字符串作爲書名。(如「我的奮鬥」作爲標題。)

但你必須明白,你不能輸入空格分隔的單詞作爲使用SCANF一個字符串。所以程序循環它並移動到下一行。

採取這樣的投入,你將不得不使用前的字符串說明的'獲取與fgets功能或使用[^ \ n]。

+0

gets(book.title)實際上也是一樣。將標題循環至作者。 –

+0

你*可以*使用scanf接受帶空格的字符串。查看現在標記爲重複的答案。是否明智地使用scanf來輸入字符串是另一回事。 – Clifford

+1

@SyedHasan:「循環」是什麼意思?你的代碼片段不包含循環。不要使用'gets()' - 更糟的是'scanf()'!這個問題被標記爲重複的,給出了使用fgets()和'scanf()'的例子。 – Clifford