本文来源:C语言函数的使用——读取字符的函数
C语言函数的使用——读取字符的函数
在C语言里,getc
、getchar
、getch
、getche
以及 scanf("%c", &ch)
都能用于字符输入,但在功能、使用场景、行为和标准性上存在差异,下面是它们的比较:
1. getc
- 标准库函数:是
- 头文件:
<stdio.h>
- 函数原型:
int getc(FILE *stream);
- 功能:从指定的输入流中读取一个字符。
- 返回值:返回读取字符的 ASCII 码值(转换为
int
类型);若到达文件末尾或出错,返回EOF
(通常为-1
)。 - 特点:需指定输入流,对标准输入可用
stdin
。读取字符后会从输入缓冲区移除。 - 使用场景:常用于从文件读取字符,也能用于标准输入。
- 示例代码:
#include <stdio.h>
int main() {
int ch;
printf("请输入一个字符: ");
ch = getc(stdin);
printf("你输入的字符是: %c\n", ch);
return 0;
}
2. getchar
- 标准库函数:是
- 头文件:
<stdio.h>
- 函数原型:
int getchar(void);
- 功能:从标准输入流
stdin
读取一个字符。 - 返回值:与
getc
类似,返回读取的字符的ASCII码值(转换为int
类型),如果到达文件末尾或发生错误,则返回EOF
。 - 特点:读取字符后从输入缓冲区移除,需按回车键将输入字符送入缓冲区。
- 使用场景:常用于简单的字符输入操作。
- 示例代码:
#include <stdio.h>
int main() {
int ch;
printf("请输入一个字符: ");
ch = getchar();
printf("你输入的字符是: %c\n", ch);
return 0;
}
3. getch
- 标准库函数:不是
- 头文件:
<conio.h>
(非标准,通常用于Windows,其他操作系统一般不支持) - 函数原型:
int getch(void);
- 功能:从键盘读取一个字符,但不回显到屏幕,无需按回车键。
- 返回值:返回读取字符的 ASCII 码值。
- 使用场景:适用于需立即响应按键输入的场景,如游戏开发。
- 特点:输入字符不回显,且不放入输入缓冲区。
- 示例代码:
#include <stdio.h>
#include <conio.h>
int main() {
int ch;
printf("请输入一个字符: ");
ch = getch();
printf("\n你输入的字符是: %c\n", ch);
return 0;
}
4. getche
- 标准库函数:不是
- 头文件:
<conio.h>
(非标准,通常用于Windows,其他操作系统一般不支持) - 函数原型:
int getche(void);
- 功能:直接从控制台读取一个字符,无需按回车键,且输入字符会回显。
- 返回值:返回读取字符的 ASCII 码值。
- 使用场景:适用于需立即响应按键输入且要显示输入字符的场景。
- 特点:输入字符会回显,不放入输入缓冲区。
- 示例代码:
#include <stdio.h>
#include <conio.h>
int main() {
int ch;
printf("请输入一个字符: ");
ch = getche();
printf("\n你输入的字符是: %c\n", ch);
return 0;
}
5. scanf("%c", &ch)
- 标准库函数:是
- 头文件:
<stdio.h>
- 函数原型:
int scanf(const char *format, ...);
- 功能:按指定格式从标准输入流
stdin
读取数据,这里是读取一个字符存到变量ch
中。 - 返回值:返回成功匹配并赋值的输入项数量;若出错或到达文件末尾,返回
EOF
。 - 特点:使用格式化字符串
"%c"
来读取字符。如果输入流中有空白字符(如空格、换行符等),scanf
会跳过这些空白字符,只读取下一个非空白字符。需按回车键将输入字符送入缓冲区,输入缓冲区的其他字符(如换行符)可能影响后续输入。 - 使用场景:可读取多种类型数据,格式字符串为
"%c"
时用于读取字符。 - 示例代码:
#include <stdio.h>
int main() {
char ch;
printf("请输入一个字符: ");
scanf("%c", &ch);
printf("你输入的字符是: %c\n", ch);
return 0;
}
总结
- 标准库函数:
getc
、getchar
和scanf("%c", &ch)
是标准库函数,定义在<stdio.h>
中,具有良好的跨平台兼容性。 - 非标准库函数:
getch
和getche
是非标准库函数,通常依赖于特定平台(如Windows的<conio.h>
),在跨平台开发中需要特别注意。 - 功能差异:
getc
和getchar
用于从标准输入或文件中读取字符,可以读空白字符。scanf("%c", &ch)
会跳过空白字符,只读取非空白字符。getch
和getche
提供了特殊的输入行为(不回显或回显),但不具有跨平台性。getchar
和scanf("%c", &ch)
会回显输入的字符,getch
不会回显,getche
会回显。
- 用途:
getc
可以从任意文件流读取字符,而getchar
和scanf("%c", &ch)
通常用于从标准输入读取字符。
函数 | 头文件 | 输入流 | 回显 | 缓冲区处理 | 适用场景 | 标准性 |
---|---|---|---|---|---|---|
getc | <stdio.h> | 可指定 | 是 | 移除读取字符 | 文件或标准输入读取 | 标准库函数 |
getchar | <stdio.h> | 标准输入 | 是 | 移除读取字符 | 简单字符输入 | 标准库函数 |
scanf("%c", &ch) | <stdio.h> | 标准输入 | 是 | 受缓冲区影响 | 多种类型数据输入 | 标准库函数 |
getch | <conio.h> | 控制台 | 否 | 不放入缓冲区 | 立即响应且不显示输入 | 非标准库函数 |
getche | <conio.h> | 控制台 | 是 | 不放入缓冲区 | 立即响应且显示输入 | 非标准库函数 |
关于scanf函数读取字符的补充说明
-
- 用"%c"格式字符控制输入时,用户从键盘输入的每个字符都被输入变量接收。例如:假设a是char型变量,执行语句:scanf(“%c”,&a);
如果用户输入字符’1’后再输入回车键,则变量a的值是’1’。如果用户直接输入回车键,则a的值是回车符’\n’。
- 用"%c"格式字符控制输入时,用户从键盘输入的每个字符都被输入变量接收。例如:假设a是char型变量,执行语句:scanf(“%c”,&a);
-
- 当用多个"%c"格式字符输入字符时,多个"%c"格式控制符之间常用逗号或空格分隔,也可以不加任何符号。例如:假设a、b和c是char型变量,若要使变量a、b和c的值分别为字符’x’、‘y’、‘z’,那么,如果执行语句:
scanf(“%c%c%c”,&a,&b,&c); // %c之间没有分隔符
用户只能输入xyz↙。
如果执行语句:
scanf(“%c,%c,%c”,&a,&b,&c); // %c之间用逗号分隔
用户可输入x,y,z↙。
如果执行语句:
scanf(“%c %c %c”,&a,&b,&c); // %c之间用空格分隔
在输入时,用户可以输入x y z↙。x、y、z之间可以有一个或多个空白字符。
- 当用多个"%c"格式字符输入字符时,多个"%c"格式控制符之间常用逗号或空格分隔,也可以不加任何符号。例如:假设a、b和c是char型变量,若要使变量a、b和c的值分别为字符’x’、‘y’、‘z’,那么,如果执行语句:
-
- 当使用多个scanf( )函数连续给多个字符型变量赋值时,例如:
scanf(“%c”,&c1);
scanf(“%c”,&c2);
若要让变量c1的值为’A’,c2的值为’B’,则正确的输入方法是:AB↙,而非A↙B↙。因为,当输入A↙B↙时,语句“scanf(“%c”,&c1);”读取键盘缓冲区中的字符’A’赋值给变量c1;紧接着语句“scanf(“%c”,&c2);”读取键盘缓冲区中的字符’\n’赋值给变量c2。
如果将上面两行语句改成如下形式,以上两种输入方式均可接收。
scanf(“\n%c”,&c1);
scanf(“\n%c”,&c2);
- 当使用多个scanf( )函数连续给多个字符型变量赋值时,例如: