scanf_s 可能会出现的死循环

                                   

 VS2015中提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。

  scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。

  scanf_s("%c   %c", &a,1, &b, 1);//每个变量后加一个数值指定长度.

 

 

每次输入完成最好用getchar清空标准输出,否则容易出现死循环.

#include <stdio.h>

#include<stdlib.h>

#include<Windows.h>

int main()

{

  int i, j, ret = 0;

  char a, b, c;

  do {

    printf("Begin to Enter:\n");

    //fflush(stdin);  //测试发现该函数无作用

    ret = scanf_s("%d        %d   %c   %c", &i, &j, &a, 1, &b, 1);

        printf("i=%d,j=%d,a=%c,b=%c\n", i, j, a, b);  

    printf("Ret=%d\n",ret);

    Sleep(2000);

    while ((c = getchar()) != '\n' && c != EOF)//如果没有getchar下面的输入方式会进

    printf("======%c\n",c);               // 入死循环.

    //system("pause");

  } while (i);

  return 0;

}

 

原因分析:如果不用getchar清空多余的字符JKKK,进入下一轮循环时, scanf_s会直接读取缓冲区而不去等待用户输入,此时读到的值JKKK不能匹配给i(%d),scanf_s出错返回0,i值一直是1,出现死循环.

posted @ 2016-10-27 15:48  SuperYang  阅读(343)  评论(0编辑  收藏  举报