測試程式碼如下

#include "../tcpiplib.h"

int main(int argc, char **argv)
{
ssize_t n;
	size_t len;
	char buf[10];
	
	//memset(buf, 0, sizeof(buf));

	n = 8;
	len = read(fileno(stdin), buf, n);
	write(fileno(stdout), buf, len);
	printf("%d strlen = %d\n",len, strlen(buf));

	fgets(buf, n, stdin);
	len = fputs(buf, stdout);
	printf("%d strlen = %d\n", len, strlen(buf));
	

	exit(0);
}

註釋掉 memset後

輸出如下

abc
abc
4 strlen = 10
efg
efg
1 strlen = 4

檢視記憶體時,發現read會在按下回車後返回,並在字串abc後加上換行符\n,但是不會再加上'\0',所以strlen有可能為10

但是fgets會在末尾加上\n\0保證正確結尾

補充:

使用scanf,輸入字串只會自動在後面補'\0',而沒有換行符'\n'


初始化時

(gdb) p buf
$1 = "*\000U<\026\000\371\210\004\b"

read後

(gdb) p buf
$2 = "abc\n\026\000\371\210\004\b"
fgets後
(gdb) p buf
$3 = "12\n\000\026\000\371\210\004\b"