最近在重新学习C语言时,发现scanf()函数使用%s或%c获取一行输入时会在空格处截断,在网上查了些资料后找到了几个解决办法
scanf()函数
原型
1
2
int scanf(const char * restrict format,...);用法
scanf()函数使用在获取输入的时候会在空格处截断,使用
1
scanf("%[^\n]", &str);
即可获取一行输入
gets()函数
原型
1
2
char *gets(char *str);用法
1
gets(str);
gets()函数也可以获取一行内容
gets()函数从标准输入读入一行文本,直到读到新行符或EOF字符之前,不会停止读入文本。
也就是:gets()不检查边界。因此,当变量空间小于一行字符串时,使用gets()会造成溢出,程序出错。
所以应少用或不使用此函数
gets_s()函数
原型
1
2
char *gets_s(char *buffer, size_t sizeInCharacters);用法
1
gets_s(str, SIZE);
gets_s()函数用法与gets()函数基本一致,但多了一个参数,使得程序更加安全
fgets()函数
原型
1
2
char *fgets(char *s, int size, FILE *stream);用法
1
fgets(str, SIZE, stdin);
fgets() 虽然比 gets() 安全,但安全是要付出代价的,代价就是它的使用比 gets() 要麻烦一点,有三个参数。它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
自定义
详见《C Primer Plus (中文版)第6版》P331-P334
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18char *s_gets(char *st,int n)
{
char *ret_val;
int i = 0;
ret_val = fgets(st, n, stdin);
if(ret_val){ //与*ret_val!='\0'相同,当ret_val指向空字符时,ret_val的值是0,即测试条件为假,while循环结束
while(st[i] != '\n' && st[i] != '\0')
i++;
if(st[i] == '\n')
st[i] = '\0';
else //如果检测到结束标志'\0',则读取但不储存输入,包括\n。
//丢弃的目的,不让多出来的留在缓冲区,保证了读取语句与键盘输入同步
while(getchar() != '\n')
continue;
}
return ret_val;
}