C语言学习Day3
程序员文章站
2022-07-15 08:45:41
...
常用的数据输入\输出函数
scanf("%c",&a) 修改变量的值,传变量的地址
printf(“a=%c”,a)只是使用变量的值,传变量就行
&
1、scanf函数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//scanf等待输入数据
int main()
{
int i;
char c;
scanf("%d", &i);//阻塞函数
printf("i=%d\n", i);//scanf函数中%d忽略空格,\n.
scanf("%c", &c);//这里不会阻塞了,因为缓冲区中有数据,
printf("c=%c\n", c);
}
20
i=20
c=
scanf被调用的时候,我们会在输入20然后回车,这时标准输入缓冲区存入20和\n(回车),但是scanf在读取的时候,只会读取20,然后在缓冲区中删去20,停止循环,缓冲区内还剩下\n。第二个scanf函数发现缓冲区内有字符,会直接读取不会要求我们再次输入。
注意,如果一开始定义的是两个int变量,将第二个scanf中间的%c换成%d,就不会出现上面的问题,因为 scanf%c忽略空格和\n.
2、scanf函数的循环读取
输入多个整数(每次输入都回车)
除了需要用到while循环,还有几个需要注意的点
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, ret;
while ((ret=scanf("%d", &i))!=EOF)
{
printf("i=%d\n", i);
}
}
正常存储情况:注意结尾需要按三次组合键ctrl+z来结束while循环
10
i=10
9
i=9
^Z
^Z
^Z
F:\C语言学习\day2\Debug\7、scanf函数的循环读取.exe (进程 17120)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口
如果输入的不是整数型会导致之前的结果无限循环:
10
i=10
a
i=10
i=10
i=10
......无限循环
解决方案:使用fflush函数:作用刷新(清空)标准输入缓冲区。
while (fflush(studin),(ret=scanf("%d", &i))!=EOF)
读取字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c;
while (scanf("%c", &c) != EOF)
{
printf("%c\n",c);
}
}
注意结尾需要按三次组合键ctrl+z来结束while循环
hello
h
e
l
l
o
^Z
^Z
^Z
F:\C语言学习\day2\Debug\7、scanf函数的循环读取.exe (进程 17120)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口
进行了修改:1、输出 为一行,原来的printf("%c\n",c)被分为printf("%c",c)2与printf("\n")、改变打印的为大写字母c-32
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c;
while (scanf("%c", &c) != EOF)
{
if (c != '\n')
{
printf("%c", c - 32);//改变输出的大小写
}//printf("%c\n",c);
else {
printf("\n");
}
}
}
hello
HELLO^Z
^Z
F:\C语言学习\day2\Debug\8.scanf函数的循环读取.exe (进程 17676)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...
scanf’多种数据类型混合输入
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, ret;
char c;
float f;
double d;
ret = scanf("%d %c%f%lf",&i,&c,&f,&d);
printf("%d %c %5.2f %5.2f\n",i,c,f,d);
}
20 a 98.5 98.5
20 a 98.50 98.50
还有一部分明天继续学,还要准备期末考试。。。。太难
上一篇: JDK实现的优先队列PriorityQueue研究
下一篇: 优先队列与堆的解析