scanf 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
第一个参数指定输入的格式(%c——字符,%s——字符串,%d——十进制整型数,%p——指针值(内存地址),%x——十六进制整数)
第二个参数是将从键盘输入的数据存放在的已定义的对应变量中,变量名前需加上取地址符 &(只有一个例外:字符数组变量不用加 &),否则会有段错误。
例子:int count;scanf("%d", &count);
scanf在往字符数组内输入数据时会存在溢出现象,造成段错误。
像上面例子里的写法,scanf在读取键盘输入时,遇到空格和回车符时会结束读取,完成存放数据操作;按完回车后,回车符会存在缓冲区中,所以只能实现一次读取(已回车为结束标志),多次操作可以如下方式实现:
int a, b, c;scanf("%d%d%d", &a, &b, &c);或者scanf("%d,%d,%d", &a, &b, &c)(ps:键盘输入时,两个数据间也要加上,以作区分)
实现多次输入时字符时,scanf会将回车符当成第二个字符输入,第二个字符变量并不能被赋值,解决方法:
char a;
char b;
scanf ("%c", &a);
while ( scanf ("%c", &b) != '\n')
{
scanf("%c",&b);
break;
}
putchar(a);
putchar(b);
也可以用getchar()来吃掉缓冲区的回车符
如果希望scanf可以实现带空格的输入,可用char str[100];;scanf (" %[^\n] ", str );
gets
gets()函数和scanf一样可以从键盘获取字符串,但是gets函数只认为回车是输入结束标志,空格不会作为结束标志
gets不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入
char s[100] = { 0 };
gets(s);//gets认为回车是输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串
//gets和scanf一样存在缓冲区溢出的问题
int i;
for (i = 0; i < 10; i++)
{
printf("%d\n", s[i]);
}
printf("----------------------------------\n");
printf("%s\n", s);
fgets
gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便,fgets已回车符结尾。
char s[10] = {0};
// 第一个参数是char的数组,第二个参数是数组的大小,单位:字节,
// 第三个参数stdin代表标准输入的意思
// fgets是安全的,不存在缓冲区溢出的问题,只要保证第二个参数小于等于数组实际的大小,就能避免缓冲区溢出问题
// fgets会将回车键读到数组里
fgets(s, sizeof(s)/sizeof(char), stdin);
printf ("%s\n", s);