getch()
、getche()
、getc()
、getchar()
、gets()
、fgetc()
、fgets()
为C语言中七个常用且相似的字符与字符串处理函数。
一、getch
int getch(void)
会从标准输入读取字符,不带回显,不需要换行符。conio.h
头文件并非C标准库中的头文件,因此默认情况下对应函数只能在Windows环境下使用。
#include <stdio.h>
#include <conio.h>
int main() {
printf("please input letter with getch():");
printf("\ngetch():%c\n", getch());
return 0;
}
PS C:\Users\atreus\Documents\Code> g++ main.cpp -o main
PS C:\Users\atreus\Documents\Code> ./main
please input letter with getch():
getch():c
PS C:\Users\atreus\Documents\Code>
二、getche
int getche(void)
会从标准输入读入一个字符,带回显,不需要换行符。
#include <stdio.h>
#include <conio.h>
int main() {
printf("please input letter with getche():");
printf("\ngetche():%c\n", getche());
return 0;
}
PS C:\Users\atreus\Documents\Code> g++ main.cpp -o main
PS C:\Users\atreus\Documents\Code> ./main
please input letter with getche():c
getche():c
PS C:\Users\atreus\Documents\Code>
三、getc
int getc(FILE *stream)
会从指定的流stream获取一个字符,程序等待输入时,缓冲区可以输入多个字符,换行符表示输入结束,但函数只会读取第一个字符。
#include <stdio.h>
int main() {
printf("please input letter with getc():");
printf("getc():%c\n", getc(stdin));
return 0;
}
atreus@AtreusMBP 18:44 code % g++ main.cpp -o main
atreus@AtreusMBP 18:44 code % ./main
please input letter with getc():ccc
getc():c
atreus@AtreusMBP 18:44 code %
四、getchar
int getchar(void)
会从标准输入读取字符,等同于 getc()
带有stdin作为参数。
#include <stdio.h>
int main() {
printf("please input letter with getchar():");
printf("getchar():%c\n", getchar());
return 0;
}
atreus@AtreusMBP 18:44 code % g++ main.cpp -o main
atreus@AtreusMBP 18:44 code % ./main
please input letter with getchar():ccc
getchar():c
atreus@AtreusMBP 18:44 code %
五、gets
char *gets(char *str)
会从标准输入stdin读取一行,并把它存储在str所指向的字符串中,当读取到换行符会停止并丢弃换行符,类似于 scanf("%[^\n]%*c", str);
。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int main() {
char *str = (char *) malloc(MAX_SIZE * sizeof(char));
printf("please input string with gets():");
gets(str); // 类似于scanf("%[^\n]%*c", str);
char c = getchar(); // 程序会在这里等待输入
printf("gets():%s\n", str);
free(str);
return 0;
}
atreus@AtreusMBP 18:48 code % g++ -w main.cpp -o main
atreus@AtreusMBP 18:48 code % ./main
warning: this program uses gets(), which is unsafe.
please input string with gets():ccc
gets():ccc
atreus@AtreusMBP 18:48 code %
六、fgetc
int fgetc(FILE *stream)
会从指定的流stream获取一个字符,fgetc()
和 getc()
最大的区别在前者是函数,后者是宏,所以 getc()
的参数不能是有副作用的表达式(即表达式的执行会改变表达式中的变量的值,如 i++
)。
#include <stdio.h>
int main() {
printf("please input letter with fgetc():");
printf("fgetc():%c\n", fgetc(stdin));
return 0;
}
atreus@AtreusMBP 18:49 code % g++ main.cpp -o main
atreus@AtreusMBP 18:49 code % ./main
please input letter with fgetc():ccc
fgetc():c
atreus@AtreusMBP 18:49 code %
七、fgets
char *fgets(char *str, int n, FILE *stream)
会从指定的流stream读取一行,并把它存储在str所指向的字符串内,当读取n-1个字符或者读取到换行符时,再或者到达文件末尾时,停止读取。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int main() {
char *str = (char *) malloc(MAX_SIZE * sizeof(char));
for (int i = 0; i < 10; i++) {
str[i] = '#';
}
printf("please input string with fgets():");
if (fgets(str, 3, stdin) != NULL) {
printf("fgets():%s\n", str);
}
free(str);
return 0;
}
atreus@AtreusMBP 18:51 code % g++ main.cpp -o main
atreus@AtreusMBP 18:51 code % ./main
please input string with fgets():ccc
fgets():cc
atreus@AtreusMBP 18:51 code %