1.什么是scanf?
scanf是C语言中的一个输入函数,可以从标准输入设备(例如键盘)或者其他设备(例如文件)中读入数据,并根据格式符指定的格式将这些数据转换为相应的数据类型。格式符是以百分号(%)开头的字符,用于指定输入的数据类型,并告诉scanf函数如何读取输入数据。
scanf("%d", &num); //读入一个整数,并将其存储在变量num中
2.如何使用scanf?
2.1 格式化输入
scanf函数的第一个参数是格式字符串,格式字符串中包含了格式符,他们指定了需要输入的数据的数据类型。第二个参数是表示输入变量的指针,scanf函数会把读取的数据储存在这些变量中。
int num;
scanf("%d", &num); //读入一个整数,并将其存储在变量num中
可以一次读入多个变量,只需在格式字符串中添加多个格式符,用空格、逗号、换行符等分隔符隔开变量即可。
int num1, num2;
scanf("%d %d", &num1, &num2); //一次读入两个整数,并将其存储在变量num1和num2中
2.2 高级输入
scanf函数还支持以下高级功能:
使用修饰符
可以在格式符前面添加修饰符,如数字表示最大宽度、+表示正负号、0表示用0填充等。
int num;
scanf("%3d", &num); //最多读取3位数字
char sign;
scanf("%+d", &num); //可以读入正负整数
int zero;
scanf("%03d", &zero); //用0进行填充
读入字符串
可以使用"%s"来读入字符串,需要注意的是,scanf函数会在遇到第一个空格或者换行符时停止读入,因此如果需要读取带空格的字符串,可以使用gets函数。
char str[10];
scanf("%s", str); //读入字符串并存储到str中
3.常见错误
3.1 缓冲区溢出
scanf函数读取字符串时,如果输入字符串长度大于数组长度,则会导致缓冲区溢出,造成程序崩溃。
char str[5];
scanf("%s", str); //"12345"输入时会发生缓冲区溢出
3.2 记得检查scanf的返回值
scanf函数返回成功读取的参数个数(即格式符数量),因此,在读取多个参数时,可以通过返回值检查是否所有参数都已经读取成功。
int num1, num2;
int res = scanf("%d %d", &num1, &num2);
if (res != 2) {
printf("输入有误!");
}
3.3 输入数据类型错误
如果格式字符串中指定的数据类型与实际输入的数据类型不匹配,则会导致scanf函数出现不可预期的错误。
char ch;
scanf("%d", &ch); //格式字符串指定的是整数,但实际读取的是字符,在某些编译器上程序会崩溃
4.总结
scanf函数是C语言中一个非常常用的输入函数,可以从标准输入设备或者其他设备中读取数据,并将其转换为相应的数据类型。在使用scanf函数时,需要通过格式符来指定输入的数据类型,并按照指定的格式读取数据。使用scanf函数需要注意不要出现缓冲区溢出、检查返回值、以及保证格式字符串指定的数据类型与实际输入的数据类型匹配等问题。