***************************************************************
这个东西真的是无比的重要:错过无数无数遍
1.VS里用scanf_s 2.变量前加&
****************************************************************
一:
#include
#include
#include
#include
int main(void)
{
int num1,num2;
char ch1,ch2,ch3;
scanf_s("%d", &num1,20);
scanf_s("%c", &ch1,20);
scanf_s("%c", &ch2,20);
scanf_s(" %c", &ch3,20);
printf("%d\t%c*\n", num1, ch1);
printf("*%c*\n", ch2);
printf("%c\n", ch3);
system("pause");
return 0;
}
当输入为:a b
输出就如下:
当输入为:a123 *
输出就如下:
也就是说:
1.第一个输入的转换说明为%d,即说明要输入到这个变量里的是一个十进制数。
但是首先输入的是a,这就不符合要求了,scanf会把a放回到输入缓冲区里。
2.这个a就被下面的那个%cd的转换说明读到了。
3.{如果是第一个输入a b那么第三个转换说明就读到空格,第四个转换说明由于在%c前有一个空格,也就是说,这个转换说明会从第一个非空格的字符开始读。}
{但是对于第二个输入即a123 ,当a被读走后,输入缓冲区里的东西就是123 ,所以下一个被读走的就是1,其次为2。
二:
关于%*d的作用,会使scanf()跳过相应的输入项。
#include
#include
int main(void)
{
int a, b, c;
scanf_s("%*d %*d %d", &a, &b, &c,20);//首先提取到的两个数被丢掉了,没有赋给变量,而最后一个数赋给了变量a,而b,c被随机赋值
printf("%d %d %d\n", a, b, c);
system("pause");
return 0;
}
#include
#include
#include
#include
#define MIN_PER_HOUR 60
int main(void)
{
int num;
int a, b;
num = scanf_s("%d %d", &a, &b,20);
printf("输入: 3 4\n");
printf("结果为%d\n", num);
_flushall();
num = scanf_s("%d %d", &a, &b, 20);
printf("输入:3,4\n");
printf("结果为%d\n", num);
_flushall();
//这个函数是定义在stdio.h里面的,在这里用十分有必要
//因为由于上一个输入,输入流里还有逗号和4没有被提取
//那么对于下面的这个输入函数,先接触到的肯定是逗号,那么也照样提取不来
//所以不用再接着输入,函数的返回值就是0了,所以有必要清空一下缓冲区
num = scanf_s("%d %d", &a, &b, 20);
printf("输入:,3 4\n");
printf("结果为%d\n", num);
system("pause");
return 0;
}
结果是:2 1 0
第一个结果是2,这个原因在上面就说过了,scanf函数除了在“%c”这种特殊的情况下会不忽略空白字符外,在其他的情况下都会忽略空白字符,这个也不例外。所以两个变量都成功的得到了值,所以返回值为2。
后面两个结果的原因也比较清楚了~