fgets函数是gets函数的替代品,C11标准已经废除gets函数.
- fgets函数的第2个参数, 它指明了读入字符的最大数量,一般传入数组的长度,如果该参数的值是n,那么fgets将读入包括换行符在内的n-1个字符,数组最后一个位置会自动存空字符'\0'.
- fget的返回值为一个char *指针,指向输入的内容第一个字符
下面回显程序去掉了fgets读取的换行符,如果输入字符过多则丢弃
#include <stdio.h>
#define STLEN 10
int main(void)
{
char words[STLEN];
int i;
puts("Enter strings (empty line to quit):");
puts("------------------");
while (fgets(words, STLEN, stdin) != NULL
&& words[0] != '\n')
{
i = 0;
while (words[i] != '\n' && words[i] != '\0')
i++;
if (words[i] == '\n')
{
printf("i = %u replace \'\\n\' to \'\\0\' \n",i);
words[i] = '\0';
}
else // must have words[i] == '\0'
{
printf("words[%u] == \'\\0\' \n",i);
while (getchar() != '\n')// 获取缓冲区下一个字符
// continue;//作用是丢弃剩余的字符
puts("continue");
}
// for(int j=0;j<STLEN;j++){
// printf(" words[%d] to int is %u \n",j,words[j]);
// }
puts(words);
puts("------------------");
}
puts("done");
return 0;
}
下面是程序的输出示例
Enter strings (empty line to quit):
------------------
12345678
words[8] replace '\n' to '\0'
12345678
键盘输入12345678,那么包括回车换行符共向程序缓冲区输入了9个字符:12345678\n,fgets 全部获得.
则存在数组中的为10个字符:12345678\n'\0',然后替换成了12345678'\0''\0'
------------------
123456789
words[9] == '\0'
123456789
输入123456789\n, 缓冲区共10个字符, fgets获得9个字符,则存在数组中的为123456789'\0'
此时还有个换行符\n存在缓冲区,由getchar()取出,然后什么都不做进入下一轮主循环
------------------
1234567890
words[9] == '\0'
continue
123456789
输入1234567890\n, 缓冲区共11个字符, fgets获得9个字符,则存在数组中的为123456789'\0'
此时还有个0和换行符在缓冲区,getchar()先取出0打印continue然后取出换行符while结束,进入下一轮主循环
------------------