一、获取多个数据
1、获取字符串和字符
#include <stdio.h>
int main()
{
char s1[32] = {0};
char ch;
scanf("%s %c", s1, &ch);
printf("%s\n", s1);
printf("%c\n", ch);
return 0;
}
运行:
root@turbo:~# ./test
hello c
hello
c
root@turbo:~#
调用scanf函数的时候,%s和%c之间需要空格,输入的时候字符串和字符之间也需要空格隔开。
2、获取字符串和整数
#include <stdio.h>
int main()
{
char s1[32] = {0};
int num;
scanf("%s%d", s1, &num);
printf("%s\n", s1);
printf("%d\n", num);
return 0;
}
运行:
root@turbo:~# ./test
hello 3
hello
3
root@turbo:~#
调用scanf函数的时候,%s和%d不需要空格,输入的时候字符串和数字需要空格隔开。
3、获取数字和字符
#include <stdio.h>
int main()
{
char ch;;
int num;
scanf("%d%c", &num, &ch);
printf("%c\n", ch);
printf("%d\n", num);
return 0;
}
运行:
root@turbo:~# ./test
3h
h
3
root@turbo:~#
调用scanf函数,%d和%c没有空格,输入的时候数字和字符间不要有空格。(如果输入的时候数字和字符需要空格隔开,则调用scanf函数的时候%d和%c也需要隔开)
二、多次调用scanf
#include <stdio.h>
int main()
{
char ch1;
char ch2;;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%c\n", ch1);
printf("%c\n", ch2);
return 0;
}
运行:
root@turbo:~# ./test
h
h
root@turbo:~#
第一次输入字符’h’的时候,因为敲了一下回车,所以标准输入缓冲区同时存入了字符’h’和’\n’,第一个scanf函数获取了字符’h’,第二个scanf函数获取字符’\n’,所以没有得到我们想要的结果。
代码修改如下:
#include <stdio.h>
int main()
{
char ch1;
char ch2;;
scanf("%c", &ch1);
getchar();
scanf("%c", &ch2);
printf("%c\n", ch1);
printf("%c\n", ch2);
return 0;
}
运行:
root@turbo:~# ./test
h
c
h
c
root@turbo:~#
三、标准输出缓冲区
标准输出缓冲区有三种:
- 行缓冲;
- 全缓冲;
- 无缓冲。
调用printf函数输出的数据并没有直接显示在屏幕上,而是先经过标准输出缓冲区。缓冲区遇到三种情况会把数据刷新到屏幕上:
- 遇到换行符;
- 缓冲区满;
- 程序正常退出。
所以在使用printf函数的时候,尽量把’\n’加上。比如:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for (i = 0; i < 3; i++)
{
printf("i = %d ", i);
sleep(1);
}
return 0;
}
运行:
root@turbo:~# ./test
i = 0 i = 1 i = 2 root@turbo:~#
3秒后直接全部输出,而不是每隔一秒输出一次。
换行符’\n’起到了刷新缓冲区的作用,数据先是被写入标准输出缓冲区,遇到换行符才被显示到屏幕上,否则只能等到程序正常结束或者缓冲区满才能看到结果。
以上几点是初学者在标准输入输出上常踩的坑,如果还有什么常见问题,欢迎补充。