Bootstrap

scanf,getchar和gets的用法和区别

一、scanf输入数值类型(int、float、double等)

 scanf,它是格式输入函数,标准格式如下:

int scanf(const char * restrict format,...);

从 标准输入流(stdin) 中按照说明的格式读入多个字符,并存入 以输入参数的值为地址的变量 中,所以必须得有 &,除了把字符串读入字符数组中。

char a[10];
scanf("%s",a);

数组变量名称本身就是特殊的指针,即,数组首元素的地址,故无需使用 & 取地址

空格、回车、Tab键不会中断输入,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);

二、scanf输入字符类型(char)

1、scanf时“%c”前面有空格

char a, b;
scanf(" %c %c", a, b);
printf("a = %c, b = %c", a, b);

scanf从第一个非空格/回车字符开始录入。

2、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会将键盘的任何一个键入都作为录入(空格看作空白字符,回车看作换行符),多余的部分存入缓存区。

三、输入字符串时

scanf

  scanf用%s读取字符串的时候,他会跳过开头的回车符、空格、跳格符去读取字符,只要开始读取了字符后面一遇到回车符、空格、跳格符就会退出读取,而且不会把最后读到的回车、空格、跳格符从缓冲区中拿走,这跟gets是不一样的。

char s[100];
scanf("%s", s);
printf("%s", s);

当它遇到空格、回车、或者Tab键时,都会自动停止输入,剩余部分存入缓冲区。

输入“abc def”,输出为“abc”。

gets

gets()主要用来接收字符串,可以接收空格,遇到‘\n’时结束,但不接收‘\n’,把 ‘\n’留存输入缓冲区;

char s[100];
gets("%s", s);
printf("%s", s);

输入“abc def”,输出为“abc def”。

getchar

getchar()主要用来接收单个字符,不管是空格或者回车都可以接收。

四、列举几种输入字符串的方式

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';

;