1. 程式人生 > >關於c語言的scanf\n的問題(scanf_s)

關於c語言的scanf\n的問題(scanf_s)

今天遇到一道題要求輸入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);報出了很多警告,好像是越界問題,然後在後面加上輸入的字元的大小就成功執行了。