scanf:“%[^ \ n]”跳過第二個輸入,但“%[^ \ n]”不跳過。為什么?請考慮以下代碼:#include <stdio.h>int main (void){
char str1[128], str2[128], str3[128];
printf ("\nEnter str1: ");
scanf ("%[^\n]", str1);
printf ("\nstr1 = %s", str1);
printf ("\nEnter str2: ");
scanf ("%[^\n]", str2);
printf ("\nstr2 = %s", str2);
printf ("\nEnter str3: ");
scanf ("%[^\n]", str3);
printf ("\nstr3 = %s", str3);
printf ("\n");
return 0;}當它僅執行scanf提示的第一站時。該計劃不會停止下一個scanfs。但是如果格式字符串從更改"%[^\n]"為" %[^\n]"(注意之前的空格%),那么它可以正常工作。是否會自動接受先前輸入緩沖區中的某些現有換行符?但沖洗stdin并不能解決這個問題。造成這種情況的原因是什么。
3 回答

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
你只需要'\n'
在閱讀完你想要的東西后“消費”這個角色。使用以下格式指令:
"%[^\n]%*c"
哪個會將新行中的所有內容讀入您傳入的字符串中,然后將使用單個字符(換行符)而不將其分配給任何內容(即'*'
“賦值抑制”)。
否則,換行符將保留在輸入流中,等待立即終止后續"%[^\n]"
格式指令。
向格式指令(" %[^\n]"
)添加空格字符的問題是空格將匹配任何空格。因此,它將從前一個輸入結束時吃掉換行符,但它也會吃掉任何其他空格(包括多個換行符)。
更新您的示例:
char* fmt = "%[^\n]%*c"; printf ("\nEnter str1: "); scanf (fmt, str1); printf ("\nstr1 = %s", str1); printf ("\nEnter str2: "); scanf (fmt, str2); printf ("\nstr2 = %s", str2); printf ("\nEnter str3: "); scanf (fmt, str3); printf ("\nstr2 = %s", str3); printf ("\n");
- 3 回答
- 0 關注
- 859 瀏覽
添加回答
舉報
0/150
提交
取消