windows控制檯輸入,默認是以文本模式打開,即便重定向輸入,文本模式不變,因此輸入時沒法讀到cr,由於windows已經把crlf轉換成單個lf。windows
若是freopen("CON", "rb",stdin); 則能夠讀到cr函數
fgets會吸取換行,可是換行也被寫入字符串spa
若是不要字符串,scanf("%d ",&d); gets()最好。vs2015刪除gets,用gets_s便可。.net
首先:fgets讀入的是帶'\n'的字符串。也就是說,在不超過第二個參數的狀況下,fgets從第三個參數(文件指針,輸入流)中不斷的讀入字符。直到遇到'\n',並將'\n'從輸入流中取出。指針
其次:gets函數不檢測讀入的字符的個數。僅僅是不斷的從標準輸入流(鍵盤)中讀入字符,直到遇到'\n'。與fgets不一樣的是,雖然gets函數也會將'\n'從輸入流中取出,但卻只是取出,而後丟掉。並不保存在目標字符串中(上述代碼中既是str)。code
最後:scanf函數不檢測讀入的字符的個數。僅僅是不斷的從標準輸入流(鍵盤)中讀入字符,直到遇到「空白符」。和fgets/gets不一樣的是,scanf不從輸入流中取出「空白符」。blog
要時刻牢記的是,'\r'是空白符,scanf函數不會讀入它。可是fgets和gets函數會讀取它!ip
http://blog.csdn.net/lanceleng/article/details/8730192ci
scanf字符串
scanf會把換行留在輸入緩衝區中,%s也會留下
Most of the conversion specifiers skip leading whitespace including newlines but %c
does not.
格式化字符串中,大部分指令都會忽略空白(isspace),%c除外
前面加一個空格,會忽略前導空白,包括換行。
while (scanf("%c",&c)!=-1)
printf("%c",c);
屢次按ctrl+Z並不結束
下面序列能夠結束
ctrl+z, cr
ctrl+Z,cr
Ctrl+D