在写网络编程时候遇到一个问题:通过fgets读取到了一行输入到缓冲区中,总是要通过strlen()来查下缓冲区中的长度,然后替换。
一开始没懂这个操作,后来查了下资料,原来fgets在读取输入流的时候,会读取你最后的那个回车,也就是'\n'。
比如你现在输入:abcde
实际上保存到缓存区中的是:abcde\n
然而fgets()会自动再补一个‘\0’,也就是说保存到缓冲区send_line中的是abcde\n\0,但是其实我们就没想要这个'\n'这势必会造成数据的不准确,所以我们就要自己来进行一个替换,把最后的'\n'给换成'\0'。
fgets(char *s, int size, FILE *stream)
//s 缓冲区
//size 最大读取长度
//文件流 如 stdin
while (fgets(send_line, MAXLINE, stdin) != NULL) {
int i = strlen(send_line);
if (send_line[i - 1] == '\n') {
send_line[i - 1] = 0;
}
...
}
这里还有个疑问,既然都会保存'\n',那为什么要判断呢?直接把最后一个'\n'进行替换不就好了吗?
我试着输入超过给定size大小的字符串,比如:
就发现,当你输入超过size的时候,其实不会再保存那个'\n'换行符了,自己就保存成了'\0'。
所以还是记住这种写法!