目录
准备
- 空白字符:空格符、换行符(\n)
- 转换说明:%d、%s、%c等
1.getchar函数
C语言提供的一种输入单个字符的方法
1.1特点:
- 每次调用getchar函数时,它会读入一个字符并将其返回,必须使用赋值(=)操作将其存储到变量中。
- getchar返回的为接收字符的ASCII码值,返回一个int类型而不是char
我们使用证明代码如下:
输入的是4,而a显示的值却是52,查看上面的ASCII码表,4对于的ASCII码值为52。所以使用getchar变量得到的是对应字符的ASCII码值。
1.2getchar在缓存区接收字符
代码
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
{
printf("%c\n", a);
}
return 0;
}
显示
其中字符a和c之间有三行空白。
原因:
首先,在键盘中输入字符是存储到内存缓冲区,getchar函数一次只能接收一个字符。
我们是先输入a后又进行了换行操作时'\n'也被输入,此时变量a被赋值为字符'a'的ASCII码值,缓冲区中还有'\n',在循环内使用printf输出了字符'a',之后printf内的换行符进入第一个空格。
第一轮循环结束后,getchar在缓存区内取出'\n',之后printf再次输出两个换行符,一个是变量a内的一个是printf后的,共三个换行,三行空白。
2.scanf
转换说明%c允许scanf函数对单个字符进行行读(可对如何字符读取)
转换说明%s允许scanf函数把字符串读入字符数组
2.1读入字符
代码
int main()
{
char a = 0;
while (scanf(" %c", &a) != EOF)
{
printf("%c\n", a);
}
return 0;
}
使用scanf函数接收字符时,也存在接收空白字符的情况,
为了强制使scanf函数在读入字符前跳过空白字符,需要在格式串中的转换说明%c前加上一个空格
显示
2.2读字符串
代码
int main()
{
char a[10] = { 0 };
scanf("%s", a);
printf("%s\n", a);
return 0;
}
显示
原因
scanf函数会跳过空白字符,然后读入字符并且存储到数组中,直到遇到空白字符为止,scanf函数读入字符串永远不会包含空白字符。
因此,scanf函数通常不会读入一整行输入。
3.扩展
3.1gets()函数
- 因为安全方面的原因,从C11起被废除了
- gets函数不会再开始读字符串之前跳过空白字符(scanf会跳过)
- gets函数会持续读入,直到找到换行符才停止(scanf函数会在任意空白字符处停止)
- gets函数会忽略换行符,不会把它存储到数组中,并用空字符('\0')代替换行符
3.2数组越界
把字符读入数组时,scanf函数和gets函数都无法检测数组合适被填满。当数组越界时,会导致未定义的行为。
可以使用%ns代替%s,数字n指出可以存储的最多字符数。
4.对比
4.1getchar优点
- getchar函数比scanf函数的执行速度更快
原因:
- scanf函数是设计用来按不同的格式读不同类型数据的,getchar比scanf要简单的多
- 为了额外的速度提升,通常getchar函数是作为宏来实现的
4.2scanf优点
- 相对与getchar可以更方便写入字符串
- 可以改变转换说明读取输入个类型的数据
5.注意
在换行后使用getchar和scanf("%c")都是危险的动作,会造成数组或变量在读取数据时的失败。
千万小心。