#include <stdio.h>

int getchar(void);
从标准输入流中(控制台或命令行终端)获取一个输入的字符。
char *gets(char *s);
从标准输入流中(控制台或命令行终端)获取一串输入的字符直至换行符 \n,但返回内容不包括\n

由于gets()中参数char*s为提前执行了malloc分配了固定空间的字符串,所以在合法的情况下可接受的字符数量是有限的。但在gets()函数执行中,是以换行符 \n的出现为终止的,所以可能导致对参数char*s操作出现越界的情况(同野指针的情形),严重会导致程序崩溃。

这里,使用getchar()封装了一个新的函数_getstring(const int max)来替代gets(),实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
static char * get_string(const int max) {
char * str = (char*) malloc(sizeof(char) * (max + 1));
for (int i = 0; i < max;i ++) {
int ch = getchar();
if (ch == 10) { // '\n'
break;
}
*(str + i) = ch;
}
*(str + max) = 0; // 添加上字符串终止符
return str;
}
int main(){
printf("%d \n", '\n');
char * str = get_string(10);
printf("get_string:%s \n", str);
free(str);
str = NULL; // 及时回收,避免后续逻辑被误用导致野指针隐患
return EXIT_SUCCESS;
}

运行结果如下图:
图中上部分为正常获取输入内容;
图中下部分为输入超出max值时会截断超出内容只保留max限度内的字符。
get_string()