一、scanf入门
scanf是C和C++中的输入函数之一,其作用是将标准输入(键盘输入)的数据输入到程序中,常用于读取用户输入的数据。
在C++中可通过以下头文件包含scanf函数:
#include <cstdio>
下面是scanf的基本用法:
scanf("%类型控制符", &变量名);
其中,类型控制符是指用来描述需要输入的数据类型的符号,例如:%d表示整型,%f表示浮点型,%c表示字符型,%s表示字符串型等。&符号表示该变量的地址,即变量所在内存区域的首地址。
例如,我们需要输入一个整数num并将其存储在变量a中,那么可以这样写:
int num; scanf("%d", &num);
这段代码会在键盘输入一个整数,然后将该整数赋值给变量num。如果输入的数据类型与类型控制符不匹配,则会导致结果无法预测。
二、scanf常见错误
在使用scanf时有一些常见的错误需要避免。
1. 输入缓冲区滞留
scanf函数输入时会自动跳过空格、换行符等空白字符,从而读取标准输入中的有效数据。但如果输入的数据类型与类型控制符不匹配,输入缓冲区中的数据不会被清除,导致后续的输入操作出现错误。
例如:
int a, b; scanf("%d", &a); scanf("%c", &b);
此时如果输入的是"12a",那么a会被赋值为12,但b会被赋值为换行符,而不是'a'。这是因为在第一行输入后,缓冲区中仍然有一个字符'a',第二个 scanf 函数会从输入缓冲区中读取,而无视当前输入的字符。
为避免这个问题,可以在类型控制符前面加上空格,让scanf函数在读取有效数据后跳过空格和换行符。例如:
int a, b; scanf(" %d", &a); scanf(" %c", &b);
加上空格后,scanf函数就会跳过空格和换行符,直接读取下一个有效字符。
2. 输入中包含非数字字符
如果输入的数据中包含了非数字字符,那么 scanf 函数会读取输入中的数字字符,并将其转换成整数,导致结果不准确。
例如:
int a; scanf("%d", &a);
如果输入的数据形如“12a”,那么 a 的值会被赋值为12,而不是“12”字符串对应的整数。
为了避免这个问题,可以在输入前用 getchar 函数清空输入缓冲区,将所有非数字字符读取并丢弃。
例如:
int a; char c; while((c = getchar()) == ' ' || c == '\n' || c == '\t'); ungetc(c, stdin); // 将读取的非数字字符放回输入缓冲区 scanf("%d", &a);
三、scanf进阶用法
scanf还有一些高级用法,可以用于读取不同类型的数据。
1. 读取字符串
要读取一个字符串,可使用%s类型控制符:
char str[100]; scanf("%s", str);
由于scanf函数在读取字符串时会自动跳过空白字符,因此可以直接使用%s读取字符串。
如果字符串中含有空格,则scanf函数只会读取空格前的部分,这可能导致字符串内容不完整。为此,应该使用fgets函数来读取字符串,它可以读取一整行文本,包括空格。
2. 读取多组数据
有时候需要从标准输入中读取多组数据,可以使用循环结合scanf来实现。
int a; while(~scanf("%d", &a)) { // 处理变量a }
在读取多组整数时,如果输入流中没有更多的数据,scanf函数会返回-1,循环就会结束。
3. 控制输入格式
有时候需要控制输入数据的格式,可以使用scanf函数的转换说明符。
int a, b; scanf("(%d,%d)", &a, &b);
该代码可以读取形如“(3,4)”这样的字符串,并将括号里面的数字读取到变量a和b中。
4. 输入换行符
输入换行符可以使用%c类型控制符:
char c; scanf("%c", &c);
但如果在scanf函数前存在 getchar 函数,则需要先调用 getchar 函数以清空输入缓冲区,否则scanf函数会将换行符作为有效字符处理。
char c; getchar(); // 清空输入缓冲区 scanf("%c", &c);
总结
本文对C++中的scanf函数进行了详细的讲解。我们学习了scanf函数的基本用法,包括类型控制符、地址符等参数,以及scanf函数的常见错误和解决方法。此外,还介绍了scanf函数的进阶用法,包括读取字符串、读取多组数据、控制输入格式和输入换行符等。相信掌握了这些知识,大家可以更加熟练地使用scanf函数来读取用户输入的数据了。