头文件 stdio.h
d
int scanf(const char *format, …); // …表示多变量输入
例如:
int a;
scanf("%d",&a);//变量前要加上&符
char arr[10]={};
scanf("%s",arr);//字符数组就不需要 因为数组名代表首地址
scanf("%d %s",a,arr);
读取原理:
把读取的数据存入对应变量。它以空格、制表符、回车符为读取的结束符。
例如:
int a;
int b;
scanf("%d%d",&a,&b);//2 \n 3 3333 记得输出与输入对应
printf("%d %d\n",a,b);//2 3
2
3 3333
2 3
//可见 读取两个数完毕后 遇到空格 会自动结束读值,然后把值赋给a和b
特例
int a;
int b;
scanf("%d%d\n",&a,&b);
printf("%d %d\n",a,b);
1 2
3
1 2
/*
当我输入 1 空格 2 回车 时,程序没有停止读值,
而是在等着 我的下一位输入,当我输入下个值时,才把 1 2 读进去
这是因为 1 空格 2 回车被\n吸收 此时缺少 结束符 当我们输入第三个数时
3 回车 这个数后的回车没有给吸收当作结束符 读值结束。
(多个回车跟一个回车效果相同)
*/
缺点:
前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完按回车键所致),接下来的scanf()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误。
例如:
char arr[10];
scanf("%c",&arr[0]); //d 回车
scanf("%c",&arr[1]);
输入为:
d 我们可以通过再末尾吸收这个回车符来避免这种结果
4 char arr[10];
5 scanf("%c\n\n",&arr[0]);
6 scanf("%c",&arr[1]);
输入:
d 回车 被\n吸收了 第6行的没有读取回车 等待下个结束符读取
f 回车
字符输入函数 头文件 stdio.h
int getchar(void);
读取一个字符,遇到回车 或者 EOF 停止读数
4 char arr[10];
5 arr[0]=getchar();
6 printf("%c\n",arr[0]);
2dsad 回车
2
可用于清除缓冲区:
4 char arr[10];
5 scanf("%c",&arr[0]);
6 scanf("%c",&arr[1]);
7 getchar();
8 printf("%c %c\n",arr[0],arr[1]);
s 回车
d 回车
s
你会发现少了个输出,这是因为 第六行读取的是
回车 d其实是在第7输入的。
修正:
4 char arr[10];
5 scanf("%c",&arr[0]);
6 getchar();
7 scanf("%c",&arr[1]);
8 printf("%c %c\n",arr[0],arr[1]);
d 回车
s 回车
d s //是不是现在就正常了
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保存储的空间足够大,以便在执行读操作时不发生溢出。此函数在stdio.h头文件中定义的。
char *gets(char *s);
4 char arr[10];
5 gets(arr);
6 printf("%s\n",arr);
sfsffadljsfjasdkjlajdfsajofjasodjofijosjodfsjsaofjasad
sfsffadljsfjasdkjlajdfsajofjasodjofijosjodfsjsaofjasad
*** stack smashing detected ***: a.out terminated
段错误 (核心已转储)
//必须人为控制输入长度 ,不然很容易出错 特别数跟数组这种内存固定
char *fgets(char *s, int size, FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
4 char arr[10];
5 fgets(arr,10,stdin);
6 printf("%s\n",arr);
sddsddsdssssssssdds
sddsddsds\0
当输入少于10时:
ddd
ddd
回车 //当输入 少于10会读取回车 ddd\n\0 strlen(arr)=4
6 int len=strlen(arr);
7 printf("%d\n",len);
/*
ddd
4
*/