安全的用法是:如果你一行至多有x个字符要读入,就用char s[x + 2];fgets(s, x + 2, stdin);这样保证读入的字符串不会被截断(截断是很危险的,不仅影响这一次的读入,还会影响后续的fgets的执行),如果输入K个字符,则s[0..K-1]是输入的字符串,s[K]='\n',s[K+1]='\0',调用printf("%s", s);将打印这一行所有的字符,外加一个换行符
如果有类似scanf("%d", &n);后面紧跟着fgets(s, x + 2, stdin);——这个fgets将不会要求用户输入,而是直接读如输入缓冲区残留的'\n'
如果有耐心,可以读读下面的注释,也可以自己用gdb调试,测试各种情况
#include <stdio.h> int main() { char s[4]; int n; //scanf("%d", &n); //fgets(s, 4, stdin); // //--in this case, you only need to input a number, s[0] = '\n', s[1] = '\0' //scanf("%d\n", &n); //fgets(s, 4, stdin); // //--in this case, you need to input 2 lines, a number, a string //if you input: //2 //ab //s will be "ab\n"--s[3] = '\0' //if you input: //2 //abc //s will be "abc"--s[3] = '\0' //if you input: //2 //abcd //s will be "abc"--s[3] = '\0' //so, how to deal with that? //if there are at most x chars, you can use fgets(s, x + 2, stdin) //this will ensure there is '\n' and '\0' fgets(s,4,stdin); fgets(s,4,stdin); //if you input: //ab //--it will prompt you to enter another string //if you input: //abc //--you don't have the chance to input another string, //the later fgets will read remaining bytes from input buffer //so, the final s will be "\n",s[0]='\n',s[1]='\0',s[2]='c',s[3]='\0' //if you input: //abcd //finally you get s = "d\n",s[0]='d',s[1]='\n',s[2]='\0',s[3]='\0' return 0; }