scanf输入需要注意的问题
分两类来解释,字符类型(char)和数值类型(int、float、double等)。
用scanf输入数值类型(int、float、double等)
空格、回车、Tab键不会中断输入,scanf从第一个非空格/回车数值开始录入,即不管中间有多少空格有多少回车,都不会中断scanf的录入,除非到达scanf中规定的录入数量。实际上在录入数值的时候,中间必须有空格或回车来间隔不同的数值。
例:
int a = 0, b = 0, c = 0, d = 0;
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("a = %d, b = %d, c = %d, d = %d", a, b, c, d);
用以下四种方式输入(□表示空格,⚪表示回车):
- 1□2□3□4
- 1□□□2□□3□4
- 1⚪2□□□3⚪4
- ⚪1⚪2⚪⚪3⚪⚪4
最终程序输出的都是:
scanf输入字符类型(char)
有两种形式:
- scanf时“%c”前面有空格
char a, b;
scanf(" %c %c", a, b);
printf("a = %c, b = %c", a, b);
这种情况跟scanf输入数值类型的情况相同,scanf从第一个非空格/回车字符开始录入。
- scanf时“%c”前面没有空格
char a, b;
scanf("%c%c", a, b);
printf("a = %c, b = %c\n", a, b);
printf("a = %d, b = %d", a, b);
这种情况scanf会将键盘录入的任何一个键入都作为录入(空格看作空白字符,回车看作换行符),多余的部分存入缓存区。(第四行代码是为了查看空格和回车是以什么形式存在字符变量中的)
例:
- □b
- ⚪b
- a⚪
- □⚪
- a□b
首先了解一下,在ASCII中,空字符对应的十进制为32,换行“\n”对应的十进制为10,从以上举例中可以看出,空格和回车都被当做输入,空格作为空字符、回车作为换行存在字符变量中,如果有多余的输入,存在缓存区中。
输入字符串时
scanf
当它遇到空格、回车、或者Tab键时,都会自动停止输入,剩余部分存入缓冲区。
例:
char s[100];
scanf("%s", s);
printf("%s", s);
输入“abc□def”,输出为“abc”
gets
gets()主要用来接收字符串,可以接收空格,遇到‘\n’时结束,但不接收‘\n’,把 ‘\n’留存输入缓冲区;把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个’\0’。
getchar
getchar()主要用来接收单个字符,不管是空格或者回车都可以接收。例如:(c = getchar()) != ’\n’ 则表示遇到回车的时候结束接收字符。
则表示遇到回车的时候结束接收字符。
列举几种输入字符串的方式
char s[100];
int i = 0;
scanf("%s", s); //不能接收空格也不能接受‘\n’
gets(s); //可以接收空格,但不能接受‘\n’,以‘\n’为结束
while ((s[i++] = getchar()) != '\n'); //可以接收空格也可以接收‘\n’,此处以‘\n’结束
s[i] = '\0';
do
{
scanf("%c", &s[i]);
} while (s[i++] != '\n'); \\要想用scanf来接收空格和‘\n’,需要用循环让scanf一个一个字符的接收,此处以‘\n’结束
s[i] = '\0';