# gets()函数 由于gets()函数不安全,C11标准中已经将这个函数废除,能不用尽量不用。 gets()函数的作用:它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加一个空字符使其成为一个字符串。听起来挺安全的,问题在于gets()函数不检查函数边界,有多少字符它就给你输入多少(来者不拒),这就造成了一个问题:缓冲区溢出(buffer overflow)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其覆盖)这样就很容易出现问题。 gets()的替代品: - fgets() - get_s() - s_gets() ## fgets()函数 fgets()通过第2个参数来限制读入的字符数来解决溢出问题。函数专门用于处理文件输入,一般情况下不是很好用。fgets()函数的第2个参数指明了读入字符的最大数量。如果参数是n,那么fgets()函数将读入n-1个字符,在最后加上空字符。或者读到遇到的第一个换行符为止。(也就是说:一旦读入的字符超过n-2将没有读入换行符)并将换行符储存在字符串中(注意与gets()对比)fgets()函数的第三个参数指明要读入的文件,如果读入从键盘输入的数据,则以stdin。 ```c #include #include #define SIZE 100 int main(int argc, char *argv[]) { char word[SIZE]; fgets(word, SIZE, stdin); fputs(word, stdout); system("pause"); return 0; } ``` ## gets_s()函数 gets_s()只从标准输入中读取数据,所以起形式为`gets_s(char *p,int n);` 其中n表示其最多读取的数量,一般为数组大小。gets_s()读到换行符,会丢弃它。如果输入行太长,gets_s()会丢弃该输入行的其余字符。其优越性在于第三点:正常来讲,输入行中多出来的字符会被留在缓冲区中,成为下一次读取语句的输入。如果下一次读取的是int 或者double类型,就可能导致程序崩溃。但优点同时也是缺点,因为在其抛弃字符的同时并不会告知我们,一旦输入出现问题我们必须自己查找。 ```c #include #include #define SIZE 100 int main(int argc, char *argv[]) { char word[SIZE]; gets_s(word, SIZE); fputs(word, stdout); printf("\n"); system("pause"); return 0; } ```