scanf的使用
scanf("格式控制",变量地址);
常见的格式符:
数据类型 | 格式符 |
---|---|
int | %d |
long long | %lld |
float | %f |
double | %lf (这个与printf的double格式符有所区别) |
char | %c |
char数组(字符串) | %s |
使用示例:
scanf("#d",&a);
scanf("%s",str);
char数组输入的时候不用加&,是因为数组名本身就会被解释为数组的地址。
int hh,mm,ss;
scanf("%d:%d:%d",&hh,&mm,&ss);
按照hh:mm:ss的格式输入,最终冒号会被“滤”掉然后其他三个数字会对应存放到变量中去。
格式控制符,对应的其实是整个输入。
char ch;
scanf("%c",&ch);
此时如果输入了一个空白字符(比如空格或者换行),此时再输出ch的时候,会发现输出了一个空格或者换行。
printf的使用
printf("格式控制",变量名称);
printf的格式控制符中,只有一个与scanf的不同:double也是%f,而不是%lf
其他的使用方法是相同的。格式控制中可以加入转义字符来控制输出格式。
其他输出的格式化处理
- %md 不足m位的int变量以m位进行右对齐输出。
- %0md 不足m位的int变量以m位进行右对齐输出,变量不足m位,在剩余位置补0
- %.mf 让浮点数保留m位小数输出,使用的是四舍六入五成双。(四舍五入可以用round()函数。)
四舍六入五成双:
就是 5以下舍弃 5以上进位 而当下一位为5时按照如下规则:
被化简的小数位后面一位的数字等于5时,
要看5前面的数字:
·若是奇数则进位,
·若是偶数则将5舍掉,
·若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
scanf的其他方面
scanf函数的返回值是其成功读入的参数的个数。
当读入失败的时候,scanf返回-1,在C/C++中,EOF表示-1.
所以,当没有说明要读入多少数据的时候,可以采用如下几种方式:
1,while…EOF
while(scanf("%d",&n)!=EOF){...}
在控制台中手动触发EOF,需要按下CTRL+Z,此时会显示^Z,再按ENTER就可以结束输入了。
(具体之前博客有讲过:《C++PrimerPlus》笔记 -文件尾条件&cin的重定向)
2,while…break
此种用法可以是题目要求在输入特定数据的时候结束输入。
既要判断是否EOF,又要判断特定数据。
int break_condition;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==break_condition || b==break_condition)
break;
...
}
类似这种。
3,while(T–)
这种是题目在最开始的输入中会给出数据组数,然后才开始输入数据。
也是比较好理解的。
int num_of_data;
scanf("%d",&num_of_data);
while(num_of_data--){...}
需要注意的是,在这种多点循环中,一定要在每次循环的初始位置重置变量和数组,这样就保证了每次循环的时候变量和数组都是初始状态。
一般使用memset函数或者fill函数可以重置数组。memset也需要注意,是按字节赋值。具体再看看再补充。