關於c語言的scanf\n的問題(scanf_s)
阿新 • • 發佈:2018-12-11
今天遇到一道題要求輸入scanf("%c %c %c\n",&a,&b,&c),結果不停地出現問題,經過許久嘗試,終於發現是\n出現了問題,scanf遇到\n看到另有玄機。這種情況下會要去多輸入一行,才有用,但是實際讀入的卻還是第一次輸入的那一行。看下面的例子:
#include<stdio.h>
int main(void)
{
int n;
scanf("%d\n",&n);
printf("%d",n);
return 0;
}
那個簡單的程式碼,必須如下輸入才有用,
從中可以看見我多輸入了一行,方才成功,但是最後輸出的結果卻是第一次輸入的數字‘5’,這就十分奇怪了。於是上網進行了查閱。
看到兩個說法,感覺這兩種說法合起來應該能大致有所理解。
連結1: https://blog.csdn.net/weiweicsdn1/article/details/52185453
連結2:https://zhidao.baidu.com/question/289196414.html
我個人理解是這樣的:scanf("%d\n",&n);這樣一條語句,輸入一個數字加回車,5\n全部被讀入到了scanf中去了,然後5被賦給了n,但是這樣在緩衝區內此時卻沒有空白符,因此無法結束,然後根據scanf的規定,必須要有一個空白符才能夠結束輸入,因此還會要求繼續輸入,而\n後面需要遇到一個非空白符才能繼續讀入,否則會一直提示輸入,因此再輸入一個非空白符,一個空白符即可成功完成scanf的停止。
此外順便記錄下vs的scanf_s函式,_s函式一般是為了安全而設計的,但是功能實際上是一樣的,
Tree BuildTree( struct TreeNode T[] ) { int Root = Null; int check[10]; int i,N; char cr, cl; scanf_s("%d\n", &N); //printf("%d\n",N); if (N) { for (i=0; i<N; i++) check[i] = 0; for (i=0; i<N; i++) { scanf_s("%c %c %c\n", &(T[i].Element),1, &cl,1, &cr,1); //printf("line42 still ok"); //deal with the cl if (cl != '-') { //printf("line45 still ok"); T[i].Left = cl-'0'; printf("%d\n",T[i].Left); check[T[i].Left] = 1; } else T[i].Left = Null; /*deal with the cr*/ if (cr != '-') { T[i].Right = cr-'0'; //printf("%d\n",T[i].Right); check[T[i].Right] = 1; } else T[i].Right = Null; } for (i=0; i<N; i++) if (!check[i]) break; Root = i; } return Root; }
以上是在vs中成功執行的程式碼,之前 scanf_s("%c %c %c\n", &(T[i].Element),&cl,&cr);報出了很多警告,好像是越界問題,然後在後面加上輸入的字元的大小就成功執行了。